Suppose an array sorted in ascending order 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.

Example 1:

Input: [3,4,5,1,2]
Output: 1

Example 2:

Input: [4,5,6,7,0,1,2]
Output: 0

这道寻找旋转有序数组的最小值肯定不能通过直接遍历整个数组来寻找,这个方法过于简单粗暴,这样的话,旋不旋转就没有意义。应该考虑将时间复杂度从简单粗暴的 O(n) 缩小到 O(lgn),这时候二分查找法就浮现在脑海。这里的二分法属于博主之前的总结帖 LeetCode Binary Search Summary 二分搜索法小结 中的第五类,也是比较难的那一类,没有固定的 target 值比较,而是要跟数组中某个特定位置上的数字比较,决定接下来去哪一边继续搜索。这里用中间的值 nums[mid] 和右边界值 nums[right] 进行比较,若数组没有旋转或者旋转点在左半段的时候,中间值是一定小于右边界值的,所以要去左半边继续搜索,反之则去右半段查找,最终返回 nums[right] 即可,参见代码如下:

解法一:

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

下面这种分治法 Divide and Conquer 的解法,由热心网友 howard144 提供,这里每次将区间 [start, end] 从中间 mid 位置分为两段,分别调用递归函数,并比较返回值,每次取返回值较小的那个即可,参见代码如下:

解法二:

class Solution {
public:
int findMin(vector<int>& nums) {
return helper(nums, , (int)nums.size() - );
}
int helper(vector<int>& nums, int start, int end) {
if (nums[start] <= nums[end]) return nums[start];
int mid = (start + end) / ;
return min(helper(nums, start, mid), helper(nums, mid + , end));
}
};

讨论:对于数组中有重复数字的情况,请参见博主的另一篇博文 Find Minimum in Rotated Sorted Array II

Github 同步地址:

https://github.com/grandyang/leetcode/issues/153

类似题目:

Search in Rotated Sorted Array

Find Minimum in Rotated Sorted Array II

参考资料:

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/discuss/48493/Compact-and-clean-C%2B%2B-solution

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/discuss/48484/A-concise-solution-with-proof-in-the-comment

LeetCode All in One 题目讲解汇总(持续更新中...)

最新文章

  1. python之路径导入
  2. Maven指令
  3. Rtp 协议实现网络广播台网络收音机
  4. 在HTML中如何把块的边框做成圆角
  5. PHP太怪了,in_array() ,strpos,
  6. yaf框架流程四
  7. RCP,TCP,C/S,B/S
  8. Unity3D之资源问题处理
  9. OrderAction
  10. SERVERPROPERTY方法说明
  11. [Xcode]SVN的使用
  12. LR的VG与Control之间的关系,并发的实质
  13. CF #284 div1 D. Traffic Jams in the Land 线段树
  14. 使用Angular CLI进行单元测试和E2E测试
  15. SCU-4527 NightMare2(Dijkstra+BFS) !!!错误题解!!!
  16. PAT A1129 Recommendation System (25 分)——set,结构体重载小于号
  17. git release功能
  18. 文献:Technology-related Disasters:A Survey toward Disaster-resilient Software Defined Networks
  19. C# NPOCO 轻量级ORM框架(入门)
  20. 使用POI做的一个生成Excel的工具类。包含了导出Excel和解析Excel方法

热门文章

  1. 解决Jquery Kendo.xxx is not a function 的方法
  2. Android5.0以下出现NoClassDefFoundError
  3. .NET 垃圾回收与内存泄漏
  4. C# - 集合类
  5. IOS 2D游戏开发框架 SpriteKit--&gt;续(创建敌对精灵)
  6. GJM : Unity3D HIAR -【 快速入门 】 六、导出 iOS 工程
  7. Android 手机卫士--绑定sim卡序列号
  8. win7 64位下vs不能以管理员身份运行的问题解决
  9. 2、项目标准的制定 - PMO项目管理办公室
  10. 读取properties配置文件的方法