Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

You may assume no duplicate exists in the array.

题目:

给定一旋转有序数组,求该数组的最小值。

思路:

  • 二分查找Binary Search

    • 比较简单,不详述,主要在于二分查找过程的循环不变量的判断
    • 递归思想
  • 旋转有序数组的循环不变量:
    • 旋转数组的最后一个值一定小于第一个值(无旋转情况例外)。在二分循环时,对于区间的判断很重要。

      • 以最右值为pivot,当num[mid]>num[right],为了维持旋转不变量,即数组的第一个值大于最后一个值,应当将left=mid,这样依旧num[left]>num[right]。当num[mid]<num[right],应当将right=mid,这样对于无旋转的数组同样适用,因为num[mid]肯定小于num[right],数组不断地往左收缩,最终会到num[0]。
      • 以最左值为pivot,同样可以通过二分求旋转数组的最小值,但对于无旋转数组而言,num[mid]肯定大于num[left],数组会不断地往右收缩,最终会到num[len-1].
      • 所以,要么采用最右值来收缩二分查找区间,要么将无旋转数组单独考虑。
    • 最小值小于左右两边的值,满足其一即可。
      • if(nums[mid]<nums[mid-1])  return nums[mid];
      • if(nums[mid]>nums[mid+1])  return nums[mid+1];
      • 因为数组是从0下标开始的,因此最好通过第二种情况来判断。
  • 方法总结:
    • 单独考虑无旋转数组,即一开始就判断num[0]<num[len-1]?如果是,则返回num[0]。再考虑旋转数组,通过最左值或者最右值来收缩二分查找的区间。对于最小值的判断,采用if(nums[mid]>nums[mid+1])  return nums[mid+1];如果出现无旋转数组,单独考虑无旋转数组的话,时间效率更高。
    • 不单独考虑无旋转数组,则通过最右值来收缩二分查找的区间。对于最小值的判断,采用if(nums[mid]>nums[mid+1])  return nums[mid+1];

代码:

1、非递归

class Solution {
public:int findMin(vector<int>& nums) {int len=nums.size();int left=0;int right=len-1;int mid;//        if(nums[left]<nums[right])
//            return nums[left];while(left<=right){if(left==right)return nums[left];mid=(left+right)/2;
//            if(nums[mid]<nums[mid-1])
//                return nums[mid];if(nums[mid]>nums[mid+1])return nums[mid+1];if(nums[mid]>nums[right])left=mid;if(nums[mid]<nums[right])right=mid;}}
};

2、递归

class Solution {public:int findMin(vector<int> &num) {int left = 0, right = num.size() - 1;return BinarySearch(num, left, right);}private:int BinarySearch(vector<int> &num, int left, int right) {if(left==right) return num[left];int mid = (left + right) / 2;
//            if(num[mid] < num[mid - 1]) return num[mid];if(num[mid] > num[mid + 1]) return num[mid + 1];if(num[mid] < num[right]) return BinarySearch(num, left, mid);if(num[mid] > num[right]) return BinarySearch(num, mid, right);}
};

 

(LeetCode 153)Find Minimum in Rotated Sorted Array相关推荐

  1. 【LeetCode】154. Find Minimum in Rotated Sorted Array II (3 solutions)

    Find Minimum in Rotated Sorted Array II Follow up for "Find Minimum in Rotated Sorted Array&quo ...

  2. LeetCode Find Minimum in Rotated Sorted Array II

    Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? Woul ...

  3. LeetCode Find Minimum in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  4. LeetCode——Find Minimum in Rotated Sorted Array II

    Question Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allo ...

  5. 154 Find Minimum in Rotated Sorted Array 2

    这道题与 153 Find Minimum in Rotated Sorted Array 基本相同,只是有可能有重复的数字, 这样a[left] 就可能与a[mid]相同 因此就多一个可能,因此在最 ...

  6. Find Minimum in Rotated Sorted Array II

    Description: Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are ...

  7. Find Minimum in Rotated Sorted Array leetcode java

    题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 ...

  8. [LeetCode]Find Minimum in Rotated Sorted Array

    题目描述: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 ...

  9. Find Minimum in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

最新文章

  1. Hello World程序里居然有bug!
  2. h5列表页的性能优化
  3. ARM NEON 优化
  4. 100个Web开发资源(收藏)
  5. 软件测试推荐专业,软件测试专业老师推荐信
  6. 在成长中遇到的挫折事件对你的影响_多种语言环境中成长的宝宝,会影响说话早晚?其实没有想象的复杂...
  7. STM32之RTC例程
  8. 内网发现,域名解析 mDNS(Arduino实现)
  9. 桌面版docker操作_10分钟快速掌握Docker必备基础知识
  10. kafka的延迟操作-pull操作详解
  11. Java内存解析 程序的执行过程
  12. 《The Django Book 2.0》中文版笔记
  13. HTG评论Kobo Aura HD:不是Kindle,那还行
  14. 很认真的聊一聊程序员的自我修养
  15. vue拖动滑块验证组件
  16. JavaSe9.29 集合
  17. linux bazel 源码,ubuntu 18.04编译安装bazel
  18. Anaconda详细安装使用教程
  19. 防诈骗安全教育宣传防诈骗知识PPT模板
  20. 超酷的摄像头魔法特效软件:ArcSoft Magic Visual Effects

热门文章

  1. lnmp环境如何添加域名和虚拟主机
  2. python编程基础之二十
  3. semantic-ui-react图像组件不显示图像的问题
  4. Python微型Web框架Bottle源码分析
  5. Redis常用五大数据类型
  6. cxf实现webservice
  7. js 操作json对象增删改
  8. 法国呼叫服务公司Aircall获得800万美元融资
  9. Atitit利用反射获取子类 集合 以及继承树
  10. MVC – 9.mvc整体请求流程