码迷,mamicode.com
首页 > 其他好文 > 详细

Search in Rotated Sorted Array II -- leetcode

时间:2015-04-17 18:21:47      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:leetcode   折半   查找   循环有序   binary   

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;
    }
};


Search in Rotated Sorted Array II -- leetcode

标签:leetcode   折半   查找   循环有序   binary   

原文地址:http://blog.csdn.net/elton_xiao/article/details/45098205

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!