Search in Rotated Sorted Array
2016-07-16 11:13
513 查看
题目描述:
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e.,
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.
解题思路:
首先通过二分查找找到前后两个子有序数组分隔处的索引,例如对于[4,5,6,7,0,1,2],首先找到
元素7的索引,然后根据target和数组首元素的大小关系确定target位于哪一个子数组上,
最后在该子数组上进行二分查找即可
AC代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
if (n <= 0) return -1;
int start = 0;
int end = n - 1;
int mid;
while (start <= end){
mid = (start + end) / 2;
if (nums[mid] >= nums[start] && nums[mid] >= nums[end]){
if (mid + 1 >= n) break;
if (nums[mid + 1] <= nums[start] && nums[mid + 1] <= nums[end]){
//ans = mid;
break;
}
else{
start = mid + 1;
}
}
else if (nums[mid] >= nums[start] && nums[mid] <= nums[end]){
start = mid + 1;
}
else{
end = mid - 1;
}
}
int start1, end1, mid1;
if (target >= nums[0]){
start1 = 0;
end1 = mid;
}
else{
start1 = mid + 1;
end1 = n - 1;
}
while (start1 <= end1){
mid1 = (start1 + end1) / 2;
if (nums[mid1] == target){
return mid1;
}
else if (nums[mid1] > target){
end1 = mid1 - 1;
}
else{
start1 = mid1 + 1;
}
}
return -1;
}
};
Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e.,
0 1 2 4 5 6 7might 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.
解题思路:
首先通过二分查找找到前后两个子有序数组分隔处的索引,例如对于[4,5,6,7,0,1,2],首先找到
元素7的索引,然后根据target和数组首元素的大小关系确定target位于哪一个子数组上,
最后在该子数组上进行二分查找即可
AC代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
if (n <= 0) return -1;
int start = 0;
int end = n - 1;
int mid;
while (start <= end){
mid = (start + end) / 2;
if (nums[mid] >= nums[start] && nums[mid] >= nums[end]){
if (mid + 1 >= n) break;
if (nums[mid + 1] <= nums[start] && nums[mid + 1] <= nums[end]){
//ans = mid;
break;
}
else{
start = mid + 1;
}
}
else if (nums[mid] >= nums[start] && nums[mid] <= nums[end]){
start = mid + 1;
}
else{
end = mid - 1;
}
}
int start1, end1, mid1;
if (target >= nums[0]){
start1 = 0;
end1 = mid;
}
else{
start1 = mid + 1;
end1 = n - 1;
}
while (start1 <= end1){
mid1 = (start1 + end1) / 2;
if (nums[mid1] == target){
return mid1;
}
else if (nums[mid1] > target){
end1 = mid1 - 1;
}
else{
start1 = mid1 + 1;
}
}
return -1;
}
};
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解