Skip to content

Commit 3be0dfe

Browse files
committed
feat: binary search
1 parent d7679ff commit 3be0dfe

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// 時間複雜度:
2+
// 空間複雜度:
3+
/*
4+
* @lc app=leetcode.cn id=153 lang=golang
5+
*
6+
* [153] 寻找旋转排序数组中的最小值
7+
*/
8+
9+
// @lc code=start
10+
func findMin(nums []int) int {
11+
left, right := 0, len(nums)-1
12+
for left <= right {
13+
if nums[left] < nums[right] {
14+
return nums[left]
15+
}
16+
mid := int(uint(left+right) >> 1)
17+
if nums[mid] < left {
18+
right = mid - 1
19+
} else {
20+
left = mid + 1
21+
}
22+
}
23+
return nums[left]
24+
}
25+
26+
// @lc code=end
27+

README.md

+87
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,93 @@ int binarySearch(int[] nums, int target){
395395
return ...;
396396
}
397397
```
398+
399+
**將搜尋區間全部統一成兩端都閉**, 方便記憶
400+
401+
```go
402+
func Search(nums []int, target int) int {
403+
lenght := len(nums)
404+
if lenght <= 0 {
405+
return -1
406+
}
407+
left, right := 0, lenght-1
408+
409+
for left <= right {
410+
mid := (right-left)/2 + left
411+
if nums[mid] == target {
412+
return mid
413+
} else if nums[mid] < target {
414+
// 找右邊
415+
left = mid + 1
416+
} else if nums[mid] > target {
417+
// 找左邊
418+
right = mid - 1
419+
}
420+
}
421+
// 都沒找到
422+
return -1
423+
}
424+
425+
// 有點類似 nums 小於 target的元素有幾個
426+
func LeftBound(nums []int, target int) (index int) {
427+
lenght := len(nums)
428+
if lenght <= 0 {
429+
return -1
430+
}
431+
left, right := 0, lenght-1
432+
433+
for left <= right {
434+
// 除以2
435+
// mid := left + (right-left)>>1
436+
mid := int(uint(right+left) >> 1)
437+
if nums[mid] == target {
438+
// 要繼續找左邊, 所以把右邊變小
439+
right = mid - 1
440+
} else if nums[mid] < target {
441+
// 找右邊
442+
left = mid + 1
443+
} else if nums[mid] > target {
444+
// 找左邊
445+
right = mid - 1
446+
}
447+
}
448+
// 都沒找到 注意: left越界情況
449+
if left >= lenght || nums[left] != target {
450+
return -1
451+
}
452+
return left
453+
}
454+
455+
// 有點類似 nums 大於 target的元素有幾個
456+
func RightBound(nums []int, target int) (index int) {
457+
lenght := len(nums)
458+
if lenght <= 0 {
459+
return -1
460+
}
461+
left, right := 0, lenght-1
462+
463+
for left <= right {
464+
// 除以2
465+
// mid := left + (right-left)>>1
466+
mid := int(uint(right+left) >> 1)
467+
if nums[mid] == target {
468+
// 注意:要繼續找右邊, 所以把左邊變大=mid+1
469+
left = mid + 1
470+
} else if nums[mid] < target {
471+
// 找右邊
472+
left = mid + 1
473+
} else if nums[mid] > target {
474+
// 找左邊
475+
right = mid - 1
476+
}
477+
}
478+
// 都沒找到 注意:right越界情況
479+
if right < 0 || nums[right] != target {
480+
return -1
481+
}
482+
return right
483+
}
484+
```
398485
| No. | Title | Solution | Difficulty | Time | Space | Topic |
399486
|--------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------:|------------|---------------------------------------|-------------------------------|---------------|
400487
| [0704](https://kimi0230.github.io/LeetcodeGolang/Leetcode/0704.Binary-Search/) | [704. Binary Search](https://leetcode.com/problems/binary-search/) | [Go](https://github.com/kimi0230/LeetcodeGolang/tree/master/Leetcode/0704.Binary-Search) | Easy | 最差:O(long n)<br> 最佳O(1)剛好在中間 | 迭代: O(1) <br/> 遞迴O(log n) | Binary Search |

0 commit comments

Comments
 (0)