寻找旋转数组中的最小值

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请找出其中最小的元素。

你可以假设数组中不存在重复元素。

示例 1:

输入: [3,4,5,1,2]

输出: 1

示例 2:

输入: [4,5,6,7,0,1,2]

输出: 0

思路

这个题是《剑指offer》中非常经典的一道题。

对于没有重复数字的数组, 旋转之后的数组可以看做两个升序数组,而且前面数组的元素都比后面数组元素大。可以用二分查找。

代码如下:

 int findMin(vector<int> &num) {
int left = 0;
int right = num.size() - 1;
int mid = 0; while (left < right) {
mid = (left + right) / 2;
//nums[mid] >nums[right] 说明nums[mid] 属于前面的数组
if (num[mid] > num[right]) {
left = mid + 1; //可以加1,将查找范围往后推
}
else if (num[mid] < num[right]) {
right = mid; //不可以减1, 因为mid可能就是我们要查找的元素
} }
return num[left];
}

letecode 154 在153的基础上加了一点, 那就是 查找的数组中包含了重复数字。 这上面代码只能处理nums[mid] == nums[right],对于 nums[mid]==nums[left] 或者 的情况无法处理。

例如:[10,1,10,10,10], 就没法得出结果。《剑指offer》中遇到 nums[left]=nums[mid] == nums[right]这种情况就对数组[left,right] 内的元素进行顺序遍历。但是我在网上发现了一个更棒的方法(详见这里)

他在遇到 nums[mid] == nums[right]的情况, 就让–right; 避开相等情况,同时也不会影响查找最小数。因为当前的nums[right]是最小数,–right去掉之后,因为有与nums[right]相等的元素任然在查找范围内,所以不会影响最后结果。

代码如下:

 int findMin(vector<int> &num) {
int left = 0;
int right = num.size() - 1;
int mid = 0; while (left < right) {
mid = (left + right) / 2;
//nums[mid] >nums[right] 说明nums[mid] 属于前面的数组
if (num[mid] > num[right]) {
left = mid + 1; //可以加1,将查找范围往后推
}
else if (num[mid] < num[right]) {
//不可以减1, 因为mid可能就是我们要查找的元素
right = mid;
}
else --right; //处理相等情况。 }
return num[left];
}

Leetcode 153.寻找旋转数组中的最小值的更多相关文章

  1. Java实现 LeetCode 153 寻找旋转排序数组中的最小值

    153. 寻找旋转排序数组中的最小值 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 请找出其中 ...

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

    假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] ). 请找出其中最小的元素. 你可以假设数组中不存在重 ...

  3. Find Minimum in Rotated Sorted Array 旋转数组中找最小值 @LeetCode

    O(n)的算法就不说了,这题主要考查的是 O(logn)的算法. 有序数组easy想到使用二分查找解决.这题就是在二分基础上做一些调整.数组仅仅有一次翻转,能够知道原有序递增数组被分成两部分,这俩部分 ...

  4. LeetCode:寻找旋转排序数组中的最小值【153】

    LeetCode:寻找旋转排序数组中的最小值[153] 题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0 ...

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

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

  6. [LeetCode每日一题]153.寻找旋转排序数组中的最小值

    [LeetCode每日一题]153.寻找旋转排序数组中的最小值 问题 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1, ...

  7. 【leetcode】153. 寻找旋转排序数组中的最小值

    题目链接:传送门 题目描述 现有一个有序数组,假设从某个数开始将它后面的数按顺序放到了数组前面.(即 [0,1,2,4,5,6,7] 可能变成 [4,5,6,7,0,1,2]). 请找出数组中的最小元 ...

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

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

  9. [LeetCode] 154. 寻找旋转排序数组中的最小值 II

    题目链接 : https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array-ii/ 题目描述: 假设按照升序排序的数组在预 ...

随机推荐

  1. 加密解密(3)Bob到CA申请证书过程

    网络安全中最知名的人物大概就是Bob和Alice了,因为很多安全原理阐述中都用这两个虚拟人物来进行实例说明. 我们来看看Bob是怎么从CA中心获得一个数字证书的: 1.Bob首先创建他自己的密钥对(k ...

  2. UIAlertController的使用,代替UIAlertView和UIActionSheet

    在iOS8以后,UIAlertView就开始被抛弃了. 取而代之是UIAlertController 以前是警示框这样写: UIAlertView *alert = [[UIAlertView all ...

  3. jquery判断checkbox最多选几个

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  4. 如何成为一名优秀的 iOS 开发工程师

    如果你是一位专业的iOS开发工程师,你应该为自己感到自豪.因为你能在强大的iOS系统下,一展身手实现自己和他人的想法,这是一件令人无比激动的事情. 作为一名iOS开发工程师,你一定想成为行业的佼佼者. ...

  5. HTML标签,简单归纳

    列表标签 有序列表: <ol><li></li></ol> 无序列表: <ul><li></li></ul&g ...

  6. 直接插入排序法原理及其js实现

    直接插入排序法就像我们打扑克牌时整理牌面一样,先让我们脑补一下我们打牌的过程. 首先摸了一张6, 接着摸到一张4,比6小,插到6的前面: 又摸到一张7,比6大,插到6的后面: 又摸到一张5,比6小,比 ...

  7. ibatis 的sqlMap 的xml 关注点

    1.当有特殊字符时候需要保持原状 eg:特殊字符  <> 错误:t.name<>' '   会报The content of elements must consist of ...

  8. 面试题6:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList

    题目 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路 使用栈依次存放输入的链表顺序的值,然后依次出栈便是链表的逆序. 代码 import java.util.ArrayList ...

  9. RegisterClientScriptBlock和RegisterStartupScript的区别

    RegisterClientScriptBlock在 Page 对象的 元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page 对象的 元素的结束标记之前发出该脚 ...

  10. MYSQL 查询方法 统计查询 链接查询 子查询

    mysql表格查询方法: 查询: 1.简单查询 select * from Info --查所有数据select Code,Name from Info --查指定列的数据select Code as ...