153. 寻找旋转排序数组中的最小值
我不复制题目了,太丑。转跳戳这里:--\(˙<>˙)/--
这道题最简单的做法就是一个个比较,从第一个比到最后一个,但是很显然这样子太暴力了,leetcode哪里会出这种题目给我们。注意题目的字眼 “假设按照升序排序的数组在预先未知的某个点上进行了旋转”,这很明显就是想让我们用二分查找写这道题目,可这种二分该怎么写呢 。
可以将中间点与终点进行比较,会产生两种情况,两个结论
- mid < right:最小值在左半部分
- mid > right:最小值在右半部分
这两个结论说明,如果使用二分查找,就只需要将 mid 上的值与 right上的值进行比较,根据结果丢弃一半。
- mid < right:left = mid+1
- mid > right:right = left;
一直到left == right就可以返回了
PS:之所以二分中间值更新变成了left = mid+1;而不是 left = (left + (right-left)/ 2),是因为需要考虑到长度为2的数组。如果长度为2,还是原本的二分跟新方式那么mid=left,mid 依然大于 left。如此导致的结果就是程序陷入死循环,left无法得到更新。
下面是AC的代码:
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 15 { 16 high = mid; 17 } 18 } 19 return nums[low]; 20 }
算法不易,诸君共勉!
大道五十,天衍四九,人遁其一!