Skip to content

Commit 92720c4

Browse files
committed
left right bound
1 parent 57a3033 commit 92720c4

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed

Leetcode/0704.Binary-Search/main.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,62 @@ func BinarySearchRecursively(nums []int, target int, start int, end int) int {
8585
return BinarySearchRecursively(nums, target, start, middle-1)
8686
}
8787
}
88+
89+
// 有點類似 nums 小於 target的元素有幾個
90+
func LeftBound(nums []int, target int) (index int) {
91+
lenght := len(nums)
92+
if lenght <= 0 {
93+
return -1
94+
}
95+
left, right := 0, lenght-1
96+
97+
for left <= right {
98+
// 除以2
99+
// mid := left + (right-left)>>1
100+
mid := int(uint(right+left) >> 1)
101+
if nums[mid] == target {
102+
// 要繼續找左邊, 所以把右邊變小
103+
right = mid - 1
104+
} else if nums[mid] < target {
105+
// 找右邊
106+
left = mid + 1
107+
} else if nums[mid] > target {
108+
// 找左邊
109+
right = mid - 1
110+
}
111+
}
112+
// 都沒找到 注意: left越界情況
113+
if left >= lenght || nums[left] != target {
114+
return -1
115+
}
116+
return left
117+
}
118+
119+
func RightBound(nums []int, target int) (index int) {
120+
lenght := len(nums)
121+
if lenght <= 0 {
122+
return -1
123+
}
124+
left, right := 0, lenght-1
125+
126+
for left <= right {
127+
// 除以2
128+
// mid := left + (right-left)>>1
129+
mid := int(uint(right+left) >> 1)
130+
if nums[mid] == target {
131+
// 注意:要繼續找右邊, 所以把左邊變大=mid+1
132+
left = mid + 1
133+
} else if nums[mid] < target {
134+
// 找右邊
135+
left = mid + 1
136+
} else if nums[mid] > target {
137+
// 找左邊
138+
right = mid - 1
139+
}
140+
}
141+
// 都沒找到 注意:right越界情況
142+
if right < 0 || nums[right] != target {
143+
return -1
144+
}
145+
return right
146+
}

Leetcode/0704.Binary-Search/main_test.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,50 @@ var tests = []struct {
2424
},
2525
}
2626

27+
var leftboundtests = []struct {
28+
arg1 []int
29+
arg2 int
30+
want int
31+
}{
32+
{
33+
[]int{1, 2, 2, 2, 3},
34+
2,
35+
1,
36+
},
37+
{
38+
[]int{2, 3, 5, 7},
39+
1,
40+
-1,
41+
},
42+
{
43+
[]int{2, 3, 5, 7},
44+
8,
45+
-1,
46+
},
47+
}
48+
49+
var rightboundtests = []struct {
50+
arg1 []int
51+
arg2 int
52+
want int
53+
}{
54+
{
55+
[]int{1, 2, 2, 4},
56+
2,
57+
2,
58+
},
59+
{
60+
[]int{1, 2, 2, 4},
61+
0,
62+
-1,
63+
},
64+
{
65+
[]int{2, 3, 5, 7},
66+
7,
67+
3,
68+
},
69+
}
70+
2771
func TestSearch(t *testing.T) {
2872
for _, tt := range tests {
2973
if got := Search(tt.arg1, tt.arg2); got != tt.want {
@@ -40,6 +84,22 @@ func TestSearch2(t *testing.T) {
4084
}
4185
}
4286

87+
func TestLeftBound(t *testing.T) {
88+
for _, tt := range leftboundtests {
89+
if got := LeftBound(tt.arg1, tt.arg2); got != tt.want {
90+
t.Errorf("got = %v, want = %v", got, tt.want)
91+
}
92+
}
93+
}
94+
95+
func TestRightBound(t *testing.T) {
96+
for _, tt := range rightboundtests {
97+
if got := RightBound(tt.arg1, tt.arg2); got != tt.want {
98+
t.Errorf("got = %v, want = %v", got, tt.want)
99+
}
100+
}
101+
}
102+
43103
func TestBinarySearch(t *testing.T) {
44104
for _, tt := range tests {
45105
if got := BinarySearch(tt.arg1, tt.arg2); got != tt.want {

0 commit comments

Comments
 (0)