154. 寻找旋转排序数组中的最小值 II
转跳点:--\(˙<>˙)/--
原本打算大年三十十一起写完的,结果这篇拖到了年初一……
这道题比刚刚那道,麻烦一点,因为有重复,所以我们需要考虑重复的情况,就是刚刚的两种情况变成了三种:
- mid < right:left = mid+1
- mid > right:right = left;
- mid = right:left++;
为什么是++?题目说了升序,如果相等那么说明只有两种可能
- 整个数组都是一个数
- 旋转点极有可能就是这个数(貌似和解题无关)
所以无论如何那种情况,题设想要的最小值一定得往后判断,全数组一样也得往后,因为输入的代码需要通用性。如果非要 -- 也可以,不过得从right--,并且left = mid。
代码如下:
1 int findMin(int* nums, int numsSize){ 2 int low = 0, high = numsSize-1; 3 while (low < high) 4 { 5 if (nums[low] < nums[high]) 6 { 7 return nums[low]; 8 } 9 int mid = low + (high - low) / 2; 10 if (nums[mid] > nums[high]) 11 { 12 low = mid + 1; 13 } 14 else if (nums[mid] < nums[high]) 15 { 16 high = mid; 17 } 18 else 19 { 20 low++; 21 } 22 } 23 return nums[low]; 24 }
算法不易,诸君共勉!
大道五十,天衍四九,人遁其一!