@@ -94,25 +94,50 @@ target < nums[mid] 则在左半区间继续进行搜索,即 right = mid -1;
94
94
95
95
下面我们来看一下二分查找的代码,可以认真思考一下 if 语句的条件,每个都没有简写。
96
96
97
+ Java Code:
98
+
97
99
``` java
98
- public static int binarySearch(int [] nums,int target,int left, int right) {
99
- // 这里需要注意,循环条件
100
- while (left <= right) {
101
- // 这里需要注意,计算mid
102
- int mid = left + ((right - left) >> 1 );
103
- if (nums[mid] == target) {
104
- return mid;
105
- }else if (nums[mid] < target) {
106
- // 这里需要注意,移动左指针
107
- left = mid + 1 ;
108
- }else if (nums[mid] > target) {
109
- // 这里需要注意,移动右指针
110
- right = mid - 1 ;
111
- }
100
+ public static int binarySearch(int [] nums,int target,int left, int right) {
101
+ // 这里需要注意,循环条件
102
+ while (left <= right) {
103
+ // 这里需要注意,计算mid
104
+ int mid = left + ((right - left) >> 1 );
105
+ if (nums[mid] == target) {
106
+ return mid;
107
+ }else if (nums[mid] < target) {
108
+ // 这里需要注意,移动左指针
109
+ left = mid + 1 ;
110
+ }else if (nums[mid] > target) {
111
+ // 这里需要注意,移动右指针
112
+ right = mid - 1 ;
112
113
}
113
- // 没有找到该元素,返回 -1
114
- return - 1 ;
115
114
}
115
+ // 没有找到该元素,返回 -1
116
+ return - 1 ;
117
+ }
118
+ ```
119
+
120
+ Go Code:
121
+
122
+ ``` go
123
+ func binarySearch (nums []int , target , left , right int ) int {
124
+ // 这里需要注意,循环条件
125
+ for left <= right {
126
+ // 这里需要注意,计算mid
127
+ mid := left + ((right - left) >> 1 )
128
+ if nums[mid] == target {
129
+ return mid
130
+ } else if nums[mid] < target {
131
+ // 这里需要注意,移动左指针
132
+ left = mid + 1
133
+ } else if nums[mid] > target {
134
+ // 这里需要注意,移动右指针
135
+ right = mid - 1
136
+ }
137
+ }
138
+ // 没有找到该元素,返回 -1
139
+ return -1
140
+ }
116
141
```
117
142
118
143
二分查找的思路及代码已经理解了,那么我们来看一下实现时容易出错的地方
@@ -127,23 +152,48 @@ target < nums[mid] 则在左半区间继续进行搜索,即 right = mid -1;
127
152
128
153
下面我们来看一下二分查找的递归写法
129
154
155
+ Java Code:
156
+
130
157
``` java
131
158
public static int binarySearch(int [] nums,int target,int left, int right) {
132
159
133
- if (left <= right) {
134
- int mid = left + ((right - left) >> 1 );
135
- if (nums[mid] == target) {
136
- // 查找成功
137
- return mid;
138
- }else if (nums[mid] > target) {
139
- // 新的区间,左半区间
140
- return binarySearch(nums,target,left,mid- 1 );
141
- }else if (nums[mid] < target) {
142
- // 新的区间,右半区间
143
- return binarySearch(nums,target,mid+ 1 ,right);
144
- }
160
+ if (left <= right) {
161
+ int mid = left + ((right - left) >> 1 );
162
+ if (nums[mid] == target) {
163
+ // 查找成功
164
+ return mid;
165
+ }else if (nums[mid] > target) {
166
+ // 新的区间,左半区间
167
+ return binarySearch(nums,target,left,mid- 1 );
168
+ }else if (nums[mid] < target) {
169
+ // 新的区间,右半区间
170
+ return binarySearch(nums,target,mid+ 1 ,right);
145
171
}
146
- // 不存在返回-1
147
- return - 1 ;
148
172
}
173
+ // 不存在返回-1
174
+ return - 1 ;
175
+ }
176
+ ```
177
+
178
+ Go Code:
179
+
180
+ ``` go
181
+ func binarySearch (nums []int , target , left , right int ) int {
182
+
183
+ if left <= right {
184
+ mid := left + ((right - left) >> 1 )
185
+ if nums[mid] == target {
186
+ // 查找成功
187
+ return mid
188
+ } else if nums[mid] > target {
189
+ // 新的区间,左半区间
190
+ return binarySearch (nums, target, left, mid-1 )
191
+ } else if nums[mid] < target {
192
+ // 新的区间,右半区间
193
+ return binarySearch (nums, target, mid+1 , right)
194
+ }
195
+ }
196
+ // 不存在返回-1
197
+ return -1
198
+ }
149
199
```
0 commit comments