首页 > 代码库 > 【Leetcode】Search in Rotated Sorted Array

【Leetcode】Search in Rotated Sorted Array

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.

思路:因为是有序序列的变种,可以考虑应用二分查找。有两种分类讨论方式,一种是根据A[middle]与target的值比较进行讨论;一种是根据找出序列中的递增序列然后继续讨论。

代码一:

class Solution {
public:
    int search(int A[], int n, int target) {
        if(n <= 0)  return -1;
        
        int left = 0;
        int right = n - 1;
        int middle = 0;
        
        while(left <= right)
        {
            middle = (left + right) / 2;
            
            if(A[middle] == target)
                return middle;
            else if(A[middle] < target)
            {
                if(A[left] >= A[middle] && A[right] < target)
                    right = middle - 1;
                else
                    left = middle + 1;
            }
            else
            {
                if(A[right] <= A[middle] && A[left] > target)
                    left = middle + 1;
                else
                    right = middle - 1;
            }
        }
        
        return -1;
    }
};

代码二:

class Solution {
public:
    int search(int A[], int n, int target) {
        if(n <= 0)  return -1;
        
        int left = 0;
        int right = n - 1;
        int middle = 0;
        
        while(left <= right)
        {
            middle = (left + right) / 2;
            
            if(A[middle] == target)
                return middle;
            
            if(A[left] <= A[middle])
            {
                if(A[left] <= target && target < A[middle])
                    right = middle - 1;
                else
                    left = middle + 1;
            }
            else
            {
                if(A[middle] < target && target <= A[right])
                    left = middle + 1;
                else
                    right = middle - 1;
            }
        }
        
        return -1;
    }
};