zoukankan      html  css  js  c++  java
  • Search in Rotated Sorted Array II

    Search in Rotated Sorted Array

    Problem

    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.

    题解

    仔细分析此题和之前一题的不同之处,前一题我们利用A[start] < A[mid]这一关键信息,而在此题中由于有重复元素的存在,在A[start] == A[mid]时无法确定有序数组,此时只能依次递增start/递减end以缩小搜索范围,时间复杂度最差变为O(n)。

    C++

    class Solution {
        /**
         * param A : an integer ratated sorted array and duplicates are allowed
         * param target :  an integer to be search
         * return : a boolean
         */
    public:
        bool search(vector<int> &A, int target) {
            if (A.empty()) {
                return false;
            }
    
            vector<int>::size_type start = 0;
            vector<int>::size_type end = A.size() - 1;
            vector<int>::size_type mid;
    
            while (start + 1 < end) {
                mid = start + (end - start) / 2;
                if (target == A[mid]) {
                    return true;
                }
                if (A[start] < A[mid]) {
                    // situation 1, numbers between start and mid are sorted
                    if (A[start] <= target && target < A[mid]) {
                        end = mid;
                    } else {
                        start = mid;
                    }
                } else if (A[start] > A[mid]) {
                    // situation 2, numbers between mid and end are sorted
                    if (A[mid] < target && target <= A[end]) {
                        start = mid;
                    } else {
                        end = mid;
                    }
                } else  {
                    // increment start
                    ++start;
                }
            }
    
            if (A[start] == target || A[end] == target) {
                return true;
            }
            return false;
        }
    };

    Java

    public class Solution {
        /**
         * param A : an integer ratated sorted array and duplicates are allowed
         * param target :  an integer to be search
         * return : a boolean
         */
        public boolean search(int[] A, int target) {
            if (A == null || A.length == 0) return false;
    
            int lb = 0, ub = A.length - 1;
            while (lb + 1 < ub) {
                int mid = lb + (ub - lb) / 2;
                if (A[mid] == target) return true;
    
                if (A[mid] > A[lb]) {
                    // case1: numbers between lb and mid are sorted
                    if (A[lb] <= target && target <= A[mid]) {
                        ub = mid;
                    } else {
                        lb = mid;
                    }
                } else if (A[mid] < A[lb]) {
                    // case2: numbers between mid and ub are sorted
                    if (A[mid] <= target && target <= A[ub]) {
                        lb = mid;
                    } else {
                        ub = mid;
                    }
                } else {
                    // case3: A[mid] == target
                    lb++;
                }
            }
    
            if (target == A[lb] || target == A[ub]) {
                return true;
            }
            return false;
        }
    }

    源码分析

    A[start] == A[mid]时递增start序号即可。

    复杂度分析

    最差情况下 O(n), 平均情况下 O(logn).

  • 相关阅读:
    bzoj 2115: [Wc2011] Xor【线性基+dfs】
    bzoj 1027: [JSOI2007]合金【凸包+Floyd】
    bzoj 4824: [Cqoi2017]老C的键盘【树形dp】
    bzoj 2111: [ZJOI2010]Perm 排列计数【树形dp+lucas】
    bzoj 4822: [Cqoi2017]老C的任务【扫描线+树状数组+二维差分】
    bzoj 4823: [Cqoi2017]老C的方块【最大权闭合子图】
    bzoj 4826: [Hnoi2017]影魔【单调栈+树状数组+扫描线】
    洛谷 P3731 [HAOI2017]新型城市化【最大流(二分图匹配)+tarjan】
    洛谷 P3732 [HAOI2017]供给侧改革【trie树】
    poj 1474 Video Surveillance 【半平面交】
  • 原文地址:https://www.cnblogs.com/lyc94620/p/12684708.html
Copyright © 2011-2022 走看看