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

错误解法:

 1 class Solution {
 2 public:
 3     /*
 4      * @param A: an integer rotated sorted array
 5      * @param target: an integer to be searched
 6      * @return: an integer
 7      */
 8     int search(vector<int> A, int target) {
 9         if (A.size() == 0) {
10             return -1;
11         }
12
13         int start = 0;
14         int end = A.size() - 1;
15
16         while (start + 1 < end) {
17             int mid = start + (end - start) / 2;
18
19             if (A[mid] == target) {
20                 return mid;
21             }
22             else if (A[mid] < target) {
23                 // 5 6 1 2 3 4
24                 if (A[mid] > A[start]) {
25                     start = mid;
26                 }
27                 // 5 6 1 2 3 4
28                 else { // mid < target && mid <= start
29                     end = mid;
30                 }
31             }
32             else if (A[mid] > target) {
33
34                 if (A[mid] < A[end]) { // mid > target && mid < end
35                     end = mid;
36                 }
37                 // 3 4 5 6 1 2 找3
38                 else { // mid > target && mid >= end
39                     start = mid;
40                 }
41             }
42         }
43
44         if (A[start] == target) {
45             return start;
46         }
47
48         if (A[end] == target) {
49             return end;
50         }
51
52         return -1;
53     }
54 };

一开始思考的方向就不对,搞晕了……

解法一:

 1 class Solution {
 2 public:
 3     /*
 4      * @param A: an integer rotated sorted array
 5      * @param target: an integer to be searched
 6      * @return: an integer
 7      */
 8     int search(vector<int> A, int target) {
 9         if (A.size() == 0) {
10             return -1;
11         }
12
13         int start = 0;
14         int end = A.size() - 1;
15
16         while (start + 1 < end) {
17             int mid = start + (end - start) / 2;
18
19             if (A[mid] == target) {
20                 return mid;
21             }
22
23             if (A[mid] >= A[start]) {
24                 if (A[start] <= target && target <= A[mid]) {
25                     end = mid;
26                 }
27                 else {
28                     start = mid;
29                 }
30             }
31             else {
32                 if (A[mid] <= target && target <= A[end]) {
33                     start = mid;
34                 }
35                 else {
36                     end = mid;
37                 }
38             }
39         }
40
41         if (A[start] == target) {
42             return start;
43         }
44
45         if (A[end] == target) {
46             return end;
47         }
48
49         return -1;
50     }
51 };

借鉴网上的一个图,可以清楚的归纳一下思路,那么代码就好写了。

这个图参考了:http://fisherlei.blogspot.com/2013/01/leetcode-search-in-rotated-sorted-array.html

解法二:

 1 class Solution {
 2 public:
 3     int search(int A[], int n, int target) {
 4         return searchRotatedSortedArray(A, 0, n-1, target);
 5     }
 6
 7     int searchRotatedSortedArray(int A[], int start, int end, int target) {
 8         if(start>end) return -1;
 9         int mid = start + (end-start)/2;
10         if(A[mid]==target) return mid;
11
12         if(A[mid]<A[end]) { // right half sorted
13             if(target>A[mid] && target<=A[end])
14                 return searchRotatedSortedArray(A, mid+1, end, target);
15             else
16                 return searchRotatedSortedArray(A, start, mid-1, target);
17         }
18         else {  // left half sorted
19             if(target>=A[start] && target<A[mid])
20                 return searchRotatedSortedArray(A, start, mid-1, target);
21             else
22                 return searchRotatedSortedArray(A, mid+1, end, target);
23         }
24     }
25 };

解法三:

 1 class Solution {
 2 public:
 3     int search(int A[], int n, int target) {
 4         int start = 0, end = n-1;
 5         while(start<=end) {
 6             int mid = start + (end-start)/2;
 7             if(A[mid]==target) return mid;
 8
 9             if(A[mid]<A[end]) { // right half sorted
10                 if(target>A[mid] && target<=A[end])
11                     start = mid+1;
12                 else
13                     end = mid-1;
14             }
15             else {  // left half sorted
16                 if(target>=A[start] && target<A[mid])
17                     end = mid-1;
18                 else
19                     start = mid+1;
20             }
21         }
22         return -1;
23     }
24 };

解法二和解法三参考了: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 5    起始元素0在中间元素的左边
情况2:  2 4 5 6 7 0 1    起始元素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] 左半,否则右半。

转载于:https://www.cnblogs.com/abc-begin/p/7552275.html

62. Search in Rotated Sorted Array【medium】相关推荐

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

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

  2. [算法题] Search in Rotated Sorted Array ii

    题目内容 题目来源:LeetCode Suppose an array sorted in ascending order is rotated at some pivot unknown to yo ...

  3. LeetCode Search in Rotated Sorted Array II

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

  4. LeetCode Search in Rotated Sorted Array II -- 有重复的旋转序列搜索

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

  5. leetcode 81 Search in Rotated Sorted Array II ----- java

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

  6. python旋转排序数组_LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现...

    题目描述: python实现Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1,2, ...

  7. 81. Search in Rotated Sorted Array II

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

  8. Search in Rotated Sorted Array II

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

  9. LeetCode Online Judge 题目C# 练习 - Search in Rotated Sorted Array II

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

最新文章

  1. Revit:从入门到精通学习教程
  2. RNA-Seq入门  如何跑通一个Rna-Seq流程
  3. Spark 源码分析 -- RDD
  4. Mozilla计划向Firefox浏览器中添加违规警告
  5. ASP怎样定义应用主题服务器,ASP.NET 4权威指南 目录
  6. 【必懂C++】第一个程序当然是HelloWorld呀 01
  7. 获取文件的MIME类型
  8. springbootajaxhas been blocked by CORS policy: No ‘Access-Control-Allow-Origin
  9. [vscode] 推荐插件及配置
  10. C++ Primer(第5版)
  11. iBatis和Hibernate浅析
  12. junit单元测试报错Failed to load ApplicationContext,但是项目发布到tomcat浏览器访问没问题...
  13. Starting Programe
  14. GStreamer基础教程之GStreamer工具
  15. linux下c/c++实例之三只允许单个程序运行
  16. Java 操作 word 文档 (二)初识 WordprocessingML 标签
  17. Linux环境安装unzip
  18. 3.5Redis的性能问题
  19. 郑军 你真是郑家的耻辱!!!
  20. 企业家够疯狂:他选择了挑战微软

热门文章

  1. C++ 判断点是否在圆的内部
  2. 东方卫视演得泰坦机器人_机器人“舞林大会”燃爆全民定向运动大赛
  3. Web负载均衡学习笔记之K8S内Ngnix微服务服务超时问题
  4. server 2008访问Server 2003数据慢
  5. jenkins+ant+git+android搭建笔记
  6. 正则表达式--元字符和限定词
  7. 封装事件绑定函数解决this在ie下的绑定问题
  8. Redis5.0:这些场景下使用,高效还降低成本!
  9. C和C++的区别 04.函数重载
  10. Gson转换 — json数据转换为Object实体公共方法