Skip to content

Commit 5837fa5

Browse files
committed
代码提交
1 parent 63c7b1e commit 5837fa5

File tree

2 files changed

+339
-250
lines changed

2 files changed

+339
-250
lines changed

Diff for: basic_algorithm/binary_search.md

+77-63
Original file line numberDiff line numberDiff line change
@@ -266,27 +266,33 @@ int findMin(vector<int>& nums) {
266266
> 请找出其中最小的元素。(包含重复元素)
267267
268268
```c++
269-
int findMin(vector<int> &nums) {
270-
if (nums.empty()) {
271-
return -1;
269+
func findMin(nums []int) int {
270+
// 思路:跳过重复元素,mid值和end值比较,分为两种情况进行处理
271+
if len(nums) == 0 {
272+
return -1
272273
}
273-
auto left = 0;
274-
auto right = nums.size() - 1;
275-
while (left + 1 < right) {
276-
while (left < right && nums[right] == nums[right - 1]) {
277-
--right;
274+
start := 0
275+
end := len(nums) - 1
276+
for start+1 < end {
277+
// 去除重复元素
278+
for start < end && nums[end] == nums[end-1] {
279+
end--
278280
}
279-
while (left < right && nums[left] == nums[left + 1]) {
280-
++left;
281+
for start < end && nums[start] == nums[start+1] {
282+
start++
281283
}
282-
auto mid = left + (right - left) / 2;
283-
if (nums[mid] <= nums[right]) {
284-
right = mid;
284+
mid := start + (end-start)/2
285+
// 中间元素和最后一个元素比较(判断中间点落在左边上升区,还是右边上升区)
286+
if nums[mid] <= nums[end] {
287+
end = mid
285288
} else {
286-
left = mid;
289+
start = mid
287290
}
288291
}
289-
return (nums[left] >= nums[right]) ? nums[right] : nums[left];
292+
if nums[start] > nums[end] {
293+
return nums[end]
294+
}
295+
return nums[start]
290296
}
291297
```
292298

@@ -297,40 +303,41 @@ int findMin(vector<int> &nums) {
297303
> 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回  -1 。
298304
> 你可以假设数组中不存在重复的元素。
299305
300-
```c++
301-
int search(vector<int> &nums, int target) {
302-
if (nums.empty()) {
303-
return -1;
306+
```go
307+
func search(nums []int, target int) int {
308+
// 思路:/ / 两条上升直线,四种情况判断
309+
if len(nums) == 0 {
310+
return -1
304311
}
305-
auto left = 0;
306-
auto right = nums.size() - 1;
307-
while (left + 1 < right) {
308-
auto mid = left + (right - left) / 2;
309-
if (nums[mid] == target) {
310-
return mid;
312+
start := 0
313+
end := len(nums) - 1
314+
for start+1 < end {
315+
mid := start + (end-start)/2
316+
// 相等直接返回
317+
if nums[mid] == target {
318+
return mid
311319
}
312-
if (nums[left] < nums[mid]) {
313-
if (nums[left] <= target && target <= nums[mid]) {
314-
right = mid;
320+
// 判断在那个区间,可能分为四种情况
321+
if nums[start] < nums[mid] {
322+
if nums[start] <= target && target <= nums[mid] {
323+
end = mid
315324
} else {
316-
left = mid;
325+
start = mid
317326
}
318-
} else if (nums[mid] < nums[right]) {
319-
// 这个判断是必须的!当只有两个数的时候,可能两个都不满足!
320-
if (target >= nums[mid] && nums[right] >= target) {
321-
right = mid;
327+
} else if nums[end] > nums[mid] {
328+
if nums[end] >= target && nums[mid] <= target {
329+
start = mid
322330
} else {
323-
left = mid;
331+
end = mid
324332
}
325333
}
326334
}
327-
if (nums[left] == target) {
328-
return left;
329-
} else if (nums[right] == target) {
330-
return right;
331-
} else {
332-
return -1;
335+
if nums[start] == target {
336+
return start
337+
} else if nums[end] == target {
338+
return end
333339
}
340+
return -1
334341
}
335342
```
336343

@@ -344,39 +351,46 @@ int search(vector<int> &nums, int target) {
344351
> ( 例如,数组  [0,0,1,2,2,5,6]  可能变为  [2,5,6,0,0,1,2] )。
345352
> 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回  true,否则返回  false。(包含重复元素)
346353
347-
```c++
348-
bool search(vector<int>& nums, int target) {
349-
if (nums.empty()) {
350-
return false;
354+
```go
355+
func search(nums []int, target int) bool {
356+
// 思路:/ / 两条上升直线,四种情况判断,并且处理重复数字
357+
if len(nums) == 0 {
358+
return false
351359
}
352-
auto left = 0;
353-
auto right = nums.size() - 1;
354-
while (left + 1 < right) {
355-
while (left < right && nums[left] == nums[left + 1]) {
356-
++left;
360+
start := 0
361+
end := len(nums) - 1
362+
for start+1 < end {
363+
// 处理重复数字
364+
for start < end && nums[start] == nums[start+1] {
365+
start++
357366
}
358-
while (left < right && nums[right] == nums[right - 1]) {
359-
--right;
367+
for start < end && nums[end] == nums[end-1] {
368+
end--
360369
}
361-
auto mid = left + (right - left) / 2;
362-
if (nums[mid] == target) {
363-
return true;
370+
mid := start + (end-start)/2
371+
// 相等直接返回
372+
if nums[mid] == target {
373+
return true
364374
}
365-
if (nums[left] < nums[mid]) {
366-
if (nums[left] <= target && target <= nums[mid]) {
367-
right = mid;
375+
// 判断在那个区间,可能分为四种情况
376+
if nums[start] < nums[mid] {
377+
if nums[start] <= target && target <= nums[mid] {
378+
end = mid
368379
} else {
369-
left = mid;
380+
start = mid
370381
}
371-
} else if (nums[mid] < nums[right]) {
372-
if (nums[mid] <= target && nums[right] >= target) {
373-
left = mid;
382+
} else if nums[end] > nums[mid] {
383+
if nums[end] >= target && nums[mid] <= target {
384+
start = mid
374385
} else {
375-
right = mid;
386+
end = mid
376387
}
377388
}
378389
}
379-
return nums[left] == target || nums[right] == target;
390+
if nums[start] == target || nums[end] == target {
391+
return true
392+
}
393+
return false
380394
}
381395
```
382396

0 commit comments

Comments
 (0)