62. Search in Rotated Sorted Array【medium】
62. Search in Rotated Sorted Array【medium】
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.
For [4, 5, 1, 2, 3] and target=1, return 2.
For [4, 5, 1, 2, 3] and target=0, return -1.
O(logN) time
错误解法:
class Solution {
public:
/*
* @param A: an integer rotated sorted array
* @param target: an integer to be searched
* @return: an integer
*/
int search(vector<int> A, int target) {
if (A.size() == ) {
return -;
}
int start = ;
int end = A.size() - ;
while (start + < end) {
int mid = start + (end - start) / ;
if (A[mid] == target) {
return mid;
}
else if (A[mid] < target) {
// 5 6 1 2 3 4
if (A[mid] > A[start]) {
start = mid;
}
// 5 6 1 2 3 4
else { // mid < target && mid <= start
end = mid;
}
}
else if (A[mid] > target) {
if (A[mid] < A[end]) { // mid > target && mid < end
end = mid;
}
// 3 4 5 6 1 2 找3
else { // mid > target && mid >= end
start = mid;
}
}
}
if (A[start] == target) {
return start;
}
if (A[end] == target) {
return end;
}
return -;
}
};
一开始思考的方向就不对,搞晕了……
解法一:
class Solution {
public:
/*
* @param A: an integer rotated sorted array
* @param target: an integer to be searched
* @return: an integer
*/
int search(vector<int> A, int target) {
if (A.size() == ) {
return -;
}
int start = ;
int end = A.size() - ;
while (start + < end) {
int mid = start + (end - start) / ;
if (A[mid] == target) {
return mid;
}
if (A[mid] >= A[start]) {
if (A[start] <= target && target <= A[mid]) {
end = mid;
}
else {
start = mid;
}
}
else {
if (A[mid] <= target && target <= A[end]) {
start = mid;
}
else {
end = mid;
}
}
}
if (A[start] == target) {
return start;
}
if (A[end] == target) {
return end;
}
return -;
}
};
借鉴网上的一个图,可以清楚的归纳一下思路,那么代码就好写了。

这个图参考了:http://fisherlei.blogspot.com/2013/01/leetcode-search-in-rotated-sorted-array.html
解法二:
class Solution {
public:
int search(int A[], int n, int target) {
return searchRotatedSortedArray(A, , n-, target);
}
int searchRotatedSortedArray(int A[], int start, int end, int target) {
if(start>end) return -;
int mid = start + (end-start)/;
if(A[mid]==target) return mid;
if(A[mid]<A[end]) { // right half sorted
if(target>A[mid] && target<=A[end])
return searchRotatedSortedArray(A, mid+, end, target);
else
return searchRotatedSortedArray(A, start, mid-, target);
}
else { // left half sorted
if(target>=A[start] && target<A[mid])
return searchRotatedSortedArray(A, start, mid-, target);
else
return searchRotatedSortedArray(A, mid+, end, target);
}
}
};
解法三:
class Solution {
public:
int search(int A[], int n, int target) {
int start = , end = n-;
while(start<=end) {
int mid = start + (end-start)/;
if(A[mid]==target) return mid;
if(A[mid]<A[end]) { // right half sorted
if(target>A[mid] && target<=A[end])
start = mid+;
else
end = mid-;
}
else { // left half sorted
if(target>=A[start] && target<A[mid])
end = mid-;
else
start = mid+;
}
}
return -;
}
};
解法二和解法三参考了:http://bangbingsyb.blogspot.com/2014/11/leetcode-search-in-rotated-sorted-array.html
思路如下:
题目一看就知道是binary search。所以关键点在于每次要能判断出target位于左半还是右半序列。解这题得先在纸上写几个rotated sorted array的例子出来找下规律。Rotated sorted array根据旋转得多少有两种情况:
原数组:0 1 2 4 5 6 7
情况1: 6 7 0 1 2 4 起始元素0在中间元素的左边
情况2: 2 4 5 6 7 0 起始元素0在中间元素的右边
两种情况都有半边是完全sorted的。根据这半边,当target != A[mid]时,可以分情况判断:
当A[mid] < A[end] < A[start]:情况1,右半序列A[mid+1 : end] sorted
A[mid] < target <= A[end], 右半序列,否则为左半序列。
当A[mid] > A[start] > A[end]:情况2,左半序列A[start : mid-1] sorted
A[start] <= target < A[mid], 左半序列,否则为右半序列
最后总结出:
A[mid] = target, 返回mid,否则
(1) A[mid] < A[end]: A[mid+1 : end] sorted
A[mid] < target <= A[end] 右半,否则左半。
(2) A[mid] > A[end] : A[start : mid-1] sorted
A[start] <= target < A[mid] 左半,否则右半。
62. Search in Rotated Sorted Array【medium】的更多相关文章
- 159. Find Minimum in Rotated Sorted Array 【medium】
159. Find Minimum in Rotated Sorted Array [medium] Suppose a sorted array is rotated at some pivot u ...
- LeetCode:33. Search in Rotated Sorted Array(Medium)
1. 原题链接 https://leetcode.com/problems/search-in-rotated-sorted-array/description/ 2. 题目要求 给定一个按升序排列的 ...
- [array] leetcode - 33. Search in Rotated Sorted Array - Medium
leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...
- 【一天一道LeetCode】#81. Search in Rotated Sorted Array II
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Follow ...
- 【leetcode】Search in Rotated Sorted Array II
Search in Rotated Sorted Array II Follow up for "Search in Rotated Sorted Array":What if d ...
- 【leetcode】Search in Rotated Sorted Array
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
- 【leetcode】Search in Rotated Sorted Array II(middle)☆
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...
- 【Leetcode】81. Search in Rotated Sorted Array II
Question: Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? ...
- 【LeetCode】81. Search in Rotated Sorted Array II (2 solutions)
Search in Rotated Sorted Array II Follow up for "Search in Rotated Sorted Array":What if d ...
随机推荐
- POJ 1466 Girls and Boys(二分图匹配)
[题目链接] http://poj.org/problem?id=1466 [题目大意] 给出一些人和他们所喜欢的人,两个人相互喜欢就能配成一对, 问最后没有配对的人的最少数量 [题解] 求最少数量, ...
- 【pb_ds】bzoj1056 [HAOI2008]排名系统/bzoj1862 [Zjoi2006]GameZ游戏排名系统
STL裸题,线下AC,bzoj无限RE ing…… #include<cstdio> #include<cctype> #include<iostream> #in ...
- Java杂谈5——关键字final与volatile
Final关键字 在Java语言中,随着语境的不同final关键字所代表的语义会有一些细微的差异.总的来说,final关键字表达的含义是“禁止修改”,这层有点类似于C++中的const关键字.之所以要 ...
- 专访阿里巴巴研究员“赵海平”:Facebook的PHP底层性能优化之路(HipHop,HHVM)
专访阿里巴巴研究员“赵海平”:Facebook的PHP底层性能优化之路 http://www.infoq.com/cn/articles/interview-alibaba-zhaohaiping
- 关于ComboGrid取值为非下拉框数据是,隐藏面板数据清空
$('#areaGuid').combogrid({ panelWidth: 300, idField: 'guid', textField: 'name', mode: 'remote', meth ...
- SHAREPOINT 2013 + PROJECT 2013 资料网站
1.http://technet.microsoft.com/zh-CN/sharepoint 2\ 博客圆专业讲解 http://www.cnblogs.com/jianyus/archive/2 ...
- iOS:CocosPods的装配和配置ReactiveCocoa
关于CocosPods的安装和配置ReactiveCocoa 1. CocoaPods和ReactiveCocoa的安装 CocoaPods是iOS最常用最有名的类库管理工具 使用ReactiveCo ...
- 我使用过的Linux命令之swig - 把C/C++的代码嵌入Java等语言的开发工具
用途说明 SWIG是Simplified Wrapper and Interface Generator的缩写,其官方站点是http://www.swig.org/.SWIG是个帮助使用C或者C++编 ...
- uCOS-ii笔记
ucos ii system 文件结构 上层: 应用软件,用户代码 中层: 与处理器无关代码 与应用程序相关配置文件 与处理器有关代码 下层: 硬件(cpu,interupt,timer,gpio,i ...
- ibatis中使用List作为传入参数的使用方法及 CDATA使用
ibatis中list做回参很简单,resultClass设为list中元素类型,dao层调用: (List)getSqlMapClientTemplate().queryForList(" ...