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.

Have you met this question in a real interview?

Yes
Example

For [4, 5, 1, 2, 3] and target=1, return 2.

For [4, 5, 1, 2, 3] and target=0, return -1.

Challenge

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】的更多相关文章

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

  2. LeetCode:33. Search in Rotated Sorted Array(Medium)

    1. 原题链接 https://leetcode.com/problems/search-in-rotated-sorted-array/description/ 2. 题目要求 给定一个按升序排列的 ...

  3. [array] leetcode - 33. Search in Rotated Sorted Array - Medium

    leetcode - 33. Search in Rotated Sorted Array - Medium descrition Suppose an array sorted in ascendi ...

  4. 【一天一道LeetCode】#81. Search in Rotated Sorted Array II

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Follow ...

  5. 【leetcode】Search in Rotated Sorted Array II

    Search in Rotated Sorted Array II Follow up for "Search in Rotated Sorted Array":What if d ...

  6. 【leetcode】Search in Rotated Sorted Array

    Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...

  7. 【leetcode】Search in Rotated Sorted Array II(middle)☆

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  8. 【Leetcode】81. Search in Rotated Sorted Array II

    Question: Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? ...

  9. 【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 ...

随机推荐

  1. [Codeforces 10E] Greedy Change

    Brief Introduction: 给你一些种类的硬币,用最少的硬币数表示X 求最小的使贪心算法错误的X Algorithm: 一道论文题,<A Polynomial-time Algori ...

  2. [Interview]读懂面试问题,在面试官面前变被动为主动

    面试是供需双方心理的较量,作为求职者来说,了解对方问题的内涵,做到“明明白白他的心”,就能变被动为主动.因此,读懂面试问题,掌握面试考官的提问的目的,有准备.有针对性地回答,对提高应聘的成功率是有很大 ...

  3. [OpenJudge8786][暴力DP]方格取数

    方格取数 总时间限制: 1000ms 内存限制: 65536kB [描述] 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0.如下图所示(见样例): ...

  4. 如何让Adobe reader 记住上次pdf文档打开位置?

    菜单栏: Edit --> Preferences --> Documents --> 勾选 “Restore last view settings where reopening ...

  5. 用正则把url解析为对象

    用正则把url解析为对象 <!DOCTYPE html><html><head><meta charset="utf-8">< ...

  6. Oracle RMAN 备份及不完全恢复(删除archievelog)

    RMAN备份命令 backup Database format='/home/oracle/backup/bak_full_%U_%T' tag='bak_full'; sql 'alter syst ...

  7. fl2440字符设备led驱动

    首先要明白字符设备驱动注册的基本流程 当我们调用insomd命令加载驱动后,驱动程序从module_init函数开始执行:硬件初始化 -> 申请主次设备号 -> 定义fops(file_o ...

  8. RDD编程 上(Spark自学三)

    弹性分布式数据集(简称RDD)是Spark对数据的核心抽象.RDD其实就是分布式的元素集合.在Spark中,对数据的操作不外乎创建RDD.转化已有RDD以及调用RDD操作进行求值.而在这一切背后,Sp ...

  9. ITIL是什么

    ITIL是什么 ITIL&CMDB 番外: ITIL&互联网 ITIL是什么 ITIL即IT基础架构库(Information Technology Infrastructure Li ...

  10. windowsclient开发--依据可下载url另存为文件(微信windowsclient这样做的)

    能够我的blog的标题会让你误解,那么好,没图说了xx: 比方微信windowsclient发送了一张图片,我们能够预览这张图片,还能够保存到本地: 那么windows程序是怎样下载这张图片的呢? 是 ...