@@ -266,27 +266,33 @@ int findMin(vector<int>& nums) {
266
266
> 请找出其中最小的元素。(包含重复元素)
267
267
268
268
```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
272
273
}
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--
278
280
}
279
- while (left < right && nums[left ] == nums[left + 1]) {
280
- ++left;
281
+ for start < end && nums[start ] == nums[start+1] {
282
+ start++
281
283
}
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
285
288
} else {
286
- left = mid;
289
+ start = mid
287
290
}
288
291
}
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]
290
296
}
291
297
```
292
298
@@ -297,40 +303,41 @@ int findMin(vector<int> &nums) {
297
303
> 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
298
304
> 你可以假设数组中不存在重复的元素。
299
305
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
304
311
}
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
311
319
}
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
315
324
} else {
316
- left = mid;
325
+ start = mid
317
326
}
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
322
330
} else {
323
- left = mid;
331
+ end = mid
324
332
}
325
333
}
326
334
}
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
333
339
}
340
+ return -1
334
341
}
335
342
```
336
343
@@ -344,39 +351,46 @@ int search(vector<int> &nums, int target) {
344
351
> ( 例如,数组 [ 0,0,1,2,2,5,6] 可能变为 [ 2,5,6,0,0,1,2] )。
345
352
> 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。(包含重复元素)
346
353
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
351
359
}
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++
357
366
}
358
- while (left < right && nums[right ] == nums[right - 1]) {
359
- --right;
367
+ for start < end && nums[end ] == nums[end- 1 ] {
368
+ end--
360
369
}
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
364
374
}
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
368
379
} else {
369
- left = mid;
380
+ start = mid
370
381
}
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
374
385
} else {
375
- right = mid;
386
+ end = mid
376
387
}
377
388
}
378
389
}
379
- return nums[left] == target || nums[right] == target;
390
+ if nums[start] == target || nums[end] == target {
391
+ return true
392
+ }
393
+ return false
380
394
}
381
395
```
382
396
0 commit comments