LeetCode Find Minimum in Rotated Sorted Array 旋转序列找最小值(二分查找)
2015-07-27 09:30
393 查看
题意:有一个有序序列A,其内部可能有部分被旋转了,比如A[1...n]被转成A[mid...n]+A[1...mid-1],如果被旋转,只有这种形式。问最小元素是?(假设没有重复元素)
思路:如果是序没乱,直接返回A[1],如果乱了,二分查找还是可以的,O(1)可能就不行了。
二分要点:mid有可能就是所要找的最小元素,所以不能轻易写出l=mid+1这样的语句,可能最小值就被忽略过了,因为我们无法直接判断A[mid]是否就是最小值。所以尽量应该是l=mid这样写,但是要防止死循环。
具体来说,可以这样做,先判断A[1]和A
的大小情况,如果A[1]<A
,那么A[1]为答案。
如果A[L]<A[mid],既然有比A[mid]更小的,那这个元素肯定是不要的,l=mid+1,因为A[L...mid]肯定是前面部分。
否则,A[mid]肯定小于A[R],那么r=mid,注意这里A[mid]可能为最小值,不能跳过。
方法一:
AC代码
思路:如果是序没乱,直接返回A[1],如果乱了,二分查找还是可以的,O(1)可能就不行了。
二分要点:mid有可能就是所要找的最小元素,所以不能轻易写出l=mid+1这样的语句,可能最小值就被忽略过了,因为我们无法直接判断A[mid]是否就是最小值。所以尽量应该是l=mid这样写,但是要防止死循环。
具体来说,可以这样做,先判断A[1]和A
的大小情况,如果A[1]<A
,那么A[1]为答案。
如果A[L]<A[mid],既然有比A[mid]更小的,那这个元素肯定是不要的,l=mid+1,因为A[L...mid]肯定是前面部分。
否则,A[mid]肯定小于A[R],那么r=mid,注意这里A[mid]可能为最小值,不能跳过。
方法一:
class Solution { public: int findMin(vector<int>& nums) { if(nums.size()==1 || nums[0]<nums[ nums.size()-1 ] ) return nums[0]; int l=0, r=nums.size()-1; while(l<r) { int mid=(l+r)/2; if( nums[mid]>nums[l] ) l=mid; else if( nums[mid]<nums[r] ) r=mid; else l++; } return nums[l]; } };
AC代码
相关文章推荐
- ArcGIS AddIN开发异常之--“ValidateAddInXMLTask”任务意外失败
- Android材料设计兼容函数库(Design Support Library)(II)浮动操作按钮(Floating Action Button)
- 微信浏览器下控制动画的动与停
- Sublime2下配置Python模块查找路径PYTHONPATH
- linux系统批量修改用户密码
- 课堂笔记01
- Python—global vs local variables
- 台式机双屏显示
- 从一个笑话看软件开发管理(转帖)
- HDU 1016 Prime Ring Problem(DFS 素数环问题)
- 011-Scala中的apply实战详解
- 简单介绍SQL Server里的闩锁
- Android材料设计兼容函数库(Design Support Library)(I)导航视图(Navigation View)
- Creo二次开发——BOM球标
- 操作系统重要数据结构
- uva11722(概率)
- Verilog中parameter和define的区别
- Android开发书籍推荐
- server 编程
- 单链表基本操作