@@ -266,33 +266,27 @@ int findMin(vector<int>& nums) {
266
266
> 请找出其中最小的元素。(包含重复元素)
267
267
268
268
```c++
269
- func findMin(nums []int) int {
270
- // 思路:跳过重复元素,mid值和end值比较,分为两种情况进行处理
271
- if len(nums) == 0 {
272
- return -1
269
+ int findMin(vector<int> &nums) {
270
+ if (nums.empty()) {
271
+ return -1;
273
272
}
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--
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;
280
278
}
281
- for start < end && nums[start ] == nums[start+1] {
282
- start++
279
+ while (left < right && nums[left ] == nums[left + 1]) {
280
+ ++left;
283
281
}
284
- mid := start + (end-start)/2
285
- // 中间元素和最后一个元素比较(判断中间点落在左边上升区,还是右边上升区)
286
- if nums[mid] <= nums[end] {
287
- end = mid
282
+ auto mid = left + (right - left) / 2;
283
+ if (nums[mid] <= nums[right]) {
284
+ right = mid;
288
285
} else {
289
- start = mid
286
+ left = mid;
290
287
}
291
288
}
292
- if nums[start] > nums[end] {
293
- return nums[end]
294
- }
295
- return nums[start]
289
+ return (nums[left] >= nums[right]) ? nums[right] : nums[left];
296
290
}
297
291
```
298
292
@@ -303,41 +297,40 @@ func findMin(nums []int) int {
303
297
> 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
304
298
> 你可以假设数组中不存在重复的元素。
305
299
306
- ``` go
307
- func search (nums []int , target int ) int {
308
- // 思路:/ / 两条上升直线,四种情况判断
309
- if len (nums) == 0 {
310
- return -1
300
+ ``` c++
301
+ int search (vector<int > &nums, int target) {
302
+ if (nums.empty()) {
303
+ return -1;
311
304
}
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
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;
319
311
}
320
- // 判断在那个区间,可能分为四种情况
321
- if nums[start] < nums[mid] {
322
- if nums[start] <= target && target <= nums[mid] {
323
- end = mid
312
+ if (nums[ left] < nums[ mid] ) {
313
+ if (nums[ left] <= target && target <= nums[ mid] ) {
314
+ right = mid;
324
315
} else {
325
- start = mid
316
+ left = mid;
326
317
}
327
- } else if nums[end] > nums[mid] {
328
- if nums[end] >= target && nums[mid] <= target {
329
- start = mid
318
+ } else if (nums[ mid] < nums[ right] ) {
319
+ // 这个判断是必须的!当只有两个数的时候,可能两个都不满足!
320
+ if (target >= nums[ mid] && nums[ right] >= target) {
321
+ right = mid;
330
322
} else {
331
- end = mid
323
+ left = mid;
332
324
}
333
325
}
334
326
}
335
- if nums[start] == target {
336
- return start
337
- } else if nums[end] == target {
338
- return end
327
+ if (nums[ left] == target) {
328
+ return left;
329
+ } else if (nums[ right] == target) {
330
+ return right;
331
+ } else {
332
+ return -1;
339
333
}
340
- return -1
341
334
}
342
335
```
343
336
@@ -351,46 +344,39 @@ func search(nums []int, target int) int {
351
344
> ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。
352
345
> 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。(包含重复元素)
353
346
354
- ``` go
355
- func search (nums []int , target int ) bool {
356
- // 思路:/ / 两条上升直线,四种情况判断,并且处理重复数字
357
- if len (nums) == 0 {
358
- return false
347
+ ```c++
348
+ bool search(vector<int>& nums, int target) {
349
+ if (nums.empty()) {
350
+ return false;
359
351
}
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++
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;
366
357
}
367
- for start < end && nums[end ] == nums[end- 1 ] {
368
- end--
358
+ while (left < right && nums[right ] == nums[right - 1]) {
359
+ --right;
369
360
}
370
- mid := start + (end-start)/2
371
- // 相等直接返回
372
- if nums[mid] == target {
373
- return true
361
+ auto mid = left + (right - left) / 2;
362
+ if (nums[mid] == target) {
363
+ return true;
374
364
}
375
- // 判断在那个区间,可能分为四种情况
376
- if nums[start] < nums[mid] {
377
- if nums[start] <= target && target <= nums[mid] {
378
- end = mid
365
+ if (nums[left] < nums[mid]) {
366
+ if (nums[left] <= target && target <= nums[mid]) {
367
+ right = mid;
379
368
} else {
380
- start = mid
369
+ left = mid;
381
370
}
382
- } else if nums[end] > nums[mid] {
383
- if nums[end] > = target && nums[mid] < = target {
384
- start = mid
371
+ } else if ( nums[mid] < nums[right]) {
372
+ if ( nums[mid] < = target && nums[right] > = target) {
373
+ left = mid;
385
374
} else {
386
- end = mid
375
+ right = mid;
387
376
}
388
377
}
389
378
}
390
- if nums[start] == target || nums[end] == target {
391
- return true
392
- }
393
- return false
379
+ return nums[left] == target || nums[right] == target;
394
380
}
395
381
```
396
382
0 commit comments