码迷,mamicode.com
首页 > 编程语言 > 详细

153. 寻找旋转排序数组中的最小值

时间:2020-01-25 00:57:30      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:更新   大于   strong   使用   死循环   get   无法   循环   pre   

  我不复制题目了,太丑。转跳戳这里:--\(˙<>˙)/--

 

  这道题最简单的做法就是一个个比较,从第一个比到最后一个,但是很显然这样子太暴力了,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 }

  算法不易,诸君共勉!

 

153. 寻找旋转排序数组中的最小值

标签:更新   大于   strong   使用   死循环   get   无法   循环   pre   

原文地址:https://www.cnblogs.com/daker-code/p/12232699.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!