您的位置:首页 > 其它

Leetcode NO.33 Search in Rotated Sorted Array

2015-01-29 11:16 127 查看
题目要求如下:

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.
本来开始我的思路是先把pivot找到,后来觉得这样会做很多无用功,脑子越转越乱。。
于是,后来想出一种只用一遍binary search变体的解法,代码如下:

class Solution {
public:
    int search(int A[], int n, int target) {

        int low = 0;
        int high = n - 1;
        int mid;

        while (low <= high) {
            mid = (low + high) / 2;
            if (A[mid] == target)
                return mid;
            else if (A[mid] > target) {
                if (A[low] > A[mid]) {
                    high = mid - 1;
                }
                else {
                    if (A[low] < target)
                        high = mid - 1;
                    else if (A[low] == target)
                        return low;
                    else
                        low = mid + 1;
                }
            }
            else {
                if (A[high] > A[mid]) {
                    if (A[high] > target)
                        low = mid + 1;
                    else if (A[high] == target)
                        return high;
                    else
                        high = mid - 1;
                }
                else {
                    low = mid + 1;
                }
            }
        }

        return -1;
    }
};
这个算法的核心思想就是确定target在哪个半区

除去直接找到的情况,逻辑是这样的:

1, A[mid] > target

1.1 A[low] > A[mid] > target: target必然在low-mid这个半区,因为另外的半区必然都大于A[mid]

1.2 A[low] <= A[mid], target < A[mid]

1.2.1:(A[low] < target < A[mid]):必然在low-mid半区

1.2.2:A[low] = target: 不解释

1.2.3: A[mid] > A[low] > target: target在mid-high半区

2, A[mid] < target

2.1 A[high]<A[mid] < target: target在mid-high半区

2.2 A[mid] < A[high],A[mid] < target:

2.2.1 A[mid]<target < A[high]:target在mid-high半区

2.2.2:相等:不解释

2.2.3: A[mid] < A[high] < target: target必然在low-mid半区
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: