33. Search in Rotated Sorted Array

Suppose an array sorted in ascending order 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.

Your algorithm's runtime complexity must be in the order of O(log n).

Example 1:

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

 1 class Solution {
 2     public int search(int[] nums, int target) {
 3         if (nums.length == 0) return -1;
 4         int l = 0, r = nums.length - 1;
 5         int n = nums.length;
 6         while (l < r) {
 7             int mid = (l + r) >> 1;
 8             if (target < nums[mid]) {
 9                 if (nums[r] > nums[l] || nums[mid] <= nums[r]) r = mid - 1;
10                 else {
11                     if (target <= nums[r]) l = mid + 1;
12                     else r = mid - 1;
13                 }
14             } else if (target > nums[mid]) {
15                 if (nums[r] > nums[l] || nums[mid] >= nums[l]) l = mid + 1;
16                 else {
17                     if (target <= nums[r]) {
18                         l = mid + 1;
19                     } else {
20                         r = mid - 1;
21                     }
22                 }
23             } else {
24                 return mid;
25             }
26         }
27         if (l >= n || r < 0) return -1;
28         return nums[l] == target ? l: -1;
29     }
30 }
 1 class Solution {
 2     public int search(int[] nums, int target) {
 3         if (nums.length == 0) return -1;
 4         int n = nums.length;
 5         int l = 0, r = n - 1;
 6         while (l < r) {
 7             int mid = (l + r) >> 1;
 8             if (nums[mid] > nums[r]) {
 9                 l = mid + 1;
10             } else {
11                 r = mid;
12             }
13         }
14         System.out.println(l);
15         int offset = l;
16         l = 0;
17         r = n - 1;
18         while (l < r) {
19             int mid = (l + r) >> 1;
20             //System.out.println(l + " " + mid + " " + r);
21             if (target < nums[(mid + offset) % n]) {
22                 r = mid - 1;
23             } else if(target > nums[(mid + offset) % n]) {
24                 l = mid + 1;
25                 
26             } else {
27                 return (mid + offset) % n;
28             }
29         }
30         
31         return nums[(l + offset) % n] == target ? (l + offset) % n : -1;
32         
33     }
34 }
 1 class Solution {
 2     public int check(int[] nums, int target, int s, int e) {
 3         
 4         
 5         int l = s, r = e;
 6         while (l < r) {
 7             int mid = (l + r) >> 1;
 8             if (target < nums[mid]) {
 9                 r = mid - 1;
10             } else if (target > nums[mid]) {
11                 l = mid + 1;
12                 
13             } else {
14                 return mid;
15             }
16         }
17         
18         System.out.println("l = " + l);
19         return nums[l] == target ? l : -1;
20         
21     }
22     public int search(int[] nums, int target) {
23         int n = nums.length;
24         if (n == 0) return -1;
25         int l = 0, r = n - 1;
26         while (l < r) {
27             int mid = (l + r) >> 1;
28             if (nums[l] < nums[mid]) {
29                 int temp = check(nums, target, l, mid);
30                 if (temp != -1) {
31                     return temp;
32                 } else {
33                     l = mid + 1;
34                 }
35             } else {
36                 int temp = check(nums, target, mid + 1, r);
37                 if (temp != -1) {
38                     return temp;
39                 } else {
40                     r = mid;
41                 }
42             }
43         }
44         return nums[l] == target ? l : -1;
45         
46     }
47 }
原文地址:https://www.cnblogs.com/hyxsolitude/p/12310006.html