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

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

相当于将数组的后面一部折叠到数组的前面去了,本质上也是二分法,这里其实也是有规律可循的:首先要得到转折点,也就是其左边右边都比其大的那一点。给一个start以及一个end,如果nums[mid] > nums[start],那么说明从start到mid也一定是递增的,很容的知道pivot一定在mid+1到end之间,那么递归的去查找就可以了。nums[mid] < nums[start]可以同样的去分析,代码如下所示:

 class Solution {
public:
int search(vector<int>& nums, int target) {
int pivot = getPivot(nums, , nums.size() - );
int pos = bSearch(nums, , pivot - , target);
if(pos != -)
return pos;
return bSearch(nums, pivot, nums.size() - , target);
} int getPivot(vector<int>&nums, int start, int end){
if(start > end)
return -;
int mid = start + (end - start)/;
if(nums[start] <= nums[mid]){
int pos = getPivot(nums, mid + , end);
if(pos == -) return start;
else
if(nums[pos] < nums[start])
return pos;
else
return start;
}else{
int pos = getPivot(nums, start, mid);
if(pos == -)
return mid;
if(nums[pos] < nums[end])
return pos;
else
return mid;
}
} int bSearch(vector<int>&nums, int start, int end, int target){
int mid;
while(start <= end){
mid = (start+end)/;
if(nums[mid] > target){
end = mid - ;
}else if(nums[mid] < target){
start = mid + ;
}else{
return mid;
}
}
return -; //返回-1,表明在这一部分没有找到,可以在下一部分查找
}
};

最新文章

  1. Android(Linux)实时监控串口数据
  2. 模拟apache commons dbutils 实现自己的BeanListHandler(回调应用)
  3. css中的1px并不总等于设备的1px(高分辨率不等 低分辨等)
  4. iOS中CocoaPads的安装与配置(总结)
  5. c1ctf2016 wp
  6. IOS中十六进制的颜色转换为UIColor
  7. 提高xshell使用效率
  8. Android App监听软键盘按键的三种方式(转)
  9. 蓝桥杯-逆波兰表达式-java
  10. Spring Boot 系列(四)静态资源处理
  11. Mysql 分区详解
  12. C++反汇编第六讲,认识C++中的Try catch语法,以及在反汇编中还原
  13. [NOIp 2009]靶形数独
  14. 大名鼎鼎的红黑树,你get了么?2-3树 绝对平衡 右旋转 左旋转 颜色反转
  15. react-native shadow失效
  16. NET Core 1.1中使用Jwt
  17. Visual Studio 2013 在使用 razor无智能提示的解决办法
  18. 项目部署相关命令(pm2)
  19. sas 数据集导出到excel
  20. oracle insert 返回ID

热门文章

  1. 线代笔记 #01# 几何水平上的理解 VS. 数值水平上的理解
  2. JavaScript校验网址
  3. Swift开发之泛型实例
  4. 百度开源分布式id生成器uid-generator源码剖析
  5. django中的分页设置
  6. linux centos7安装phpMyAdmin详解,以及解决各种bug问题
  7. 解析TCP三次握手
  8. jQuery基本筛选选择器
  9. Extjs前端框架解决了什么问题
  10. node.js 之 http 架设