您的位置:首页 > 其它

Search in Rotated Sorted Array II -- leetcode

2015-04-17 16:01 232 查看
Follow up for "Search in Rotated Sorted Array":

What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.

循环有序数组,且存在重复。

基本思路:

进行折半查找

1. 左端点 小于 中间结点, 左端区间,必为非递减有序。 可判断 target值是否在此区间中。若是,在此区间查找,否则,在另一端点查找。

2. 左端点 大于 中间结点, 则右区间,必为非递减有序。 处理同上。

3. 左端点 等于 中间结点

3.1 此时,如果 右端点 和 中间不相等, 则, 左边区间,所以的值必定一样。 可直接排除点左区间,进入右区间查找。

3.2 三个点都相等, 此时情况不明,无法进行折半。 此时,只能排除掉左端点和右端点,进行小幅度范围缩小。 正是因为有此分支存在,时间复杂度变成了O(n)

class Solution {
public:
    bool search(int A[], int n, int target) {
        int low = 0, high = n-1;
        while (low <= high) {
            const int mid = low + (high - low) / 2;
            if (A[mid] == target) 
                return true;
            else if (A[low] < A[mid]) {
                if (A[low] <= target && target < A[mid])
                    high = mid - 1;
                else
                    low = mid + 1;
            }
            else if (A[low] > A[mid]) {
                if (A[mid] < target && target <= A[high])
                    low = mid + 1;
                else
                    high = mid - 1;
            }
            else if (A[low] != A[high])
                low = mid + 1;
            else {
                ++low;
                --high;
            }
        }
        
        return false;
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: