33. Search in Rotated Sorted Array

题目链接:https://leetcode.com/problems/search-in-rotated-sorted-array/

解题思路:

和剑指offer上的题目一样,两个递增的子数组,找一个值。

二分法

如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,我们只要在有序的半段里用首尾两个数组来判断目标值是否在这一区域内,这样就可以确定保留哪半边了。

这道题让在旋转数组中搜索一个给定值,若存在返回坐标,若不存在返回-1。我们还是考虑二分搜索法,但是这道题的难点在于我们不知道原数组在哪旋转了,我们还是用题目中给的例子来分析,对于数组[0 1 2 4 5 6 7] 共有下列七种旋转方法:

0  1  2   4  5  6  7

7  0  1   2  4  5  6

6  7  0   1  2  4  5

5  6  7   0  1  2  4

4  5  6  7  0  1  2

2  4  5  6  7  0  1

1  2  4  5  6  7  0

 1 class Solution {
 2     public int search(int[] nums, int target) {
 3         
 4         if(nums.length==0||nums==null)
 5             return -1;
 6         
 7         int left=0;
 8         int right = nums.length-1;
 9         
10         while(left<=right)
11         {
12             int mid = (left+right)/2;
13             
14             if(nums[mid]==target) return mid;
15             
16             else if(nums[mid]<nums[right])
17             {
18                 if(nums[mid]<target&& nums[right]>=target)
19                     left = mid+1;
20                 else
21                     right = mid-1;
22             }
23             else 
24             {
25                 if(nums[left]<=target && nums[mid]>target)
26                     right=mid-1;
27                 else
28                     left=mid+1;
29             }
30             
31         }
32         return -1;
33         
34     }
35 }
原文地址:https://www.cnblogs.com/wangyufeiaichiyu/p/10834499.html