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 }

  算法不易,诸君共勉!

 

posted @ 2020-01-24 23:59  秦_殇  阅读(141)  评论(0编辑  收藏  举报