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=;
int right=len-;
int mid; // if(nums[left]<nums[right])
// return nums[left]; while(left<=right){
if(left==right)
return nums[left];
mid=(left+right)/;
// if(nums[mid]<nums[mid-1])
// return nums[mid];
if(nums[mid]>nums[mid+])
return nums[mid+];
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 = , right = num.size() - ;
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) / ;
// if(num[mid] < num[mid - 1]) return num[mid];
if(num[mid] > num[mid + ]) return num[mid + ];
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(153) Find Minimum in Rotated Sorted Array

    题目 Total Accepted: 65121 Total Submissions: 190974 Difficulty: Medium Suppose a sorted array is rota ...

  2. LeetCode(154) Find Minimum in Rotated Sorted Array II

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

  3. 【LeetCode】154. Find Minimum in Rotated Sorted Array II 解题报告(Python)

    [LeetCode]154. Find Minimum in Rotated Sorted Array II 解题报告(Python) 标签: LeetCode 题目地址:https://leetco ...

  4. LeetCode 新题: Find Minimum in Rotated Sorted Array 解题报告-二分法模板解法

    Find Minimum in Rotated Sorted Array Question Solution Suppose a sorted array is rotated at some piv ...

  5. LeetCode OJ 154. Find Minimum in Rotated Sorted Array II

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

  6. LeetCode 新题: Find Minimum in Rotated Sorted Array II 解题报告-二分法模板解法

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

  7. 【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 ...

  8. 【刷题-LeetCode】154 Find Minimum in Rotated Sorted Array II

    Find Minimum in Rotated Sorted Array II Suppose an array sorted in ascending order is rotated at som ...

  9. Leetcode之二分法专题-153. 寻找旋转排序数组中的最小值(Find Minimum in Rotated Sorted Array)

    Leetcode之二分法专题-153. 寻找旋转排序数组中的最小值(Find Minimum in Rotated Sorted Array) 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ...

随机推荐

  1. 随笔idea-辗转落户cnblogs

    辗转了几个blog,也用了自己域名2年,感觉忙起来,可能没有那么多时间去维护自己的域: 其他地方的blog也不在一块,思虑许久后,来到cnblogs:

  2. 【转载】利用一个堆溢出漏洞实现 VMware 虚拟机逃逸

    1. 介绍 2017年3月,长亭安全研究实验室(Chaitin Security Research Lab)参加了 Pwn2Own 黑客大赛,我作为团队的一员,一直专注于 VMware Worksta ...

  3. 记一次centos7.2下用crontab执行定时任务的过程(初级)

    实验目的:每分钟往某个文件写数据(crontab最小单位是分钟),具体shell命令我是放在一个文件里的.先创建两个空文件:/tmp/a.txt(目标文件)和/tmp/a.sh(脚本文件). 命令如下 ...

  4. C++反汇编-虚函数

    学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 在C++中,使用关键字virtual声明为虚函数. 虚函数地址表(虚表) 定义:当类中定义有虚函数时,编译器会把 ...

  5. gcc g++支持C++11 标准编译及其区别

    g++ -g -Wall -std=c++11 main.cpp gcc -g -Wall -std=c11 main.cpp 如果不想每次写这个-std=C++11这个选项该怎么办呢? 方法出处:h ...

  6. 模拟出ios中流行的黑色背景底

    [activityIndicatorView setBackgroundColor:[UIColor colorWithRed: green: blue: alpha:0.4]]; 用上面的语法,可以 ...

  7. ios的一些知识点

    ios的一些知识点 一 非ARC的内存管理情况 1-autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段落,开 ...

  8. EntityFramework(EF)贪婪加载和延迟加载的选择和使用

    贪婪加载:顾名思议就是把所有要加载的东西一 次性读取 1 using (var context = new MyDbContext()) 2 { 3 var orders = from o in co ...

  9. pytest文档22-fixture详细介绍-作为参数传入,error和failed区别

    前言 fixture是pytest的核心功能,也是亮点功能,熟练掌握fixture的使用方法,pytest用起来才会得心应手! fixture简介 fixture的目的是提供一个固定基线,在该基线上测 ...

  10. Selenium2+python自动化61-Chrome您使用的是不受支持的命令行标记:--ignore-certificate-errors

    前言 您使用的是不受支持的命令行标记:--ignore-certificate-errors.稳定性和安全性会有所下降 selenium2启动Chrome浏览器是需要安装驱动包的,但是不同的Chrom ...