【Leetcode】33. Search in Rotated Sorted Array
2016-04-19 14:57
375 查看
问题描述:
二分查找,有序翻转后的数组上进行查找 ,返回下标。
问题分析:
这题关键在于找到一个性质,就是如果这个数组确实被翻转过,那么 一定有a[0] > a
,所以根据这个条件来判断,当前l r 是否在单调区间上。
问题解决:
首先判断target所在区间,然后判断m所在区间,最后先将l 或者 r 往target区间上靠, 然后把m往target上靠。
代码如下:
二分查找,有序翻转后的数组上进行查找 ,返回下标。
问题分析:
这题关键在于找到一个性质,就是如果这个数组确实被翻转过,那么 一定有a[0] > a
,所以根据这个条件来判断,当前l r 是否在单调区间上。
问题解决:
首先判断target所在区间,然后判断m所在区间,最后先将l 或者 r 往target区间上靠, 然后把m往target上靠。
代码如下:
class Solution { public: int search(vector<int>& nums, int target) { int l = 0, r = nums.size() - 1, m; while(l <= r){ m = (l + r)>>1; if(nums[m] == target) return m; if(nums[l] <= nums[r]){ if(nums[m] < target) l = m + 1; else r = m - 1; }else{ if(target >= nums[l]){//target在左侧区间 if(nums[m] < nums[r])//m在右侧区间 r = m - 1;//让m 左移 else{// m在左侧区间 if(nums[m] > target) r = m - 1; else l = m + 1; } } else{//target在右侧区间 if(nums[m] > nums[r])//m在左侧区间 l = m + 1;//让m 右移 else{//m在右侧区间 if(nums[m] > target) r = m - 1; else l = m + 1; } } } } return -1; } };
相关文章推荐
- 先贴出代码C++ 中的单例模式
- Newtonsoft.Json高级用法
- Java测试Memcached
- oracle函数trunc的使用
- 安卓service 基础
- 新品速递:有了这些家具,50平房间秒变90平!
- 详解mmseg
- 集合
- 求项目管理的书和资料
- 统计命令
- 高德地图 2D和3D的区别
- zoomeye批量页面抓取工具
- java知识点2016.4.14
- Debug调试心得
- 【unity3d学习】unity延迟执行代码的快捷方式
- sysfs
- TimesTen 应用层数据库缓存学习:14. 用户自定义(User Managed)缓存
- 装饰模式与代理模式的区别
- 安装Jenkins后 启动时失败的问题解决
- Android开发中那些需要注意的坑