Skip to content

Commit 2c30cfe

Browse files
committed
代码提交
1 parent 859d840 commit 2c30cfe

File tree

2 files changed

+339
-250
lines changed

2 files changed

+339
-250
lines changed

basic_algorithm/binary_search.md

Lines changed: 77 additions & 63 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy