zoukankan      html  css  js  c++  java
  • LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++>

    LeetCode 81 Search in Rotated Sorted Array II [binary search] <c++>

    给出排序好的一维有重复元素的数组,随机取一个位置断开,把前半部分接到后半部分后面,得到一个新数组,在新数组中查找给定数是否存在,时间复杂度限制(O(log_2n))

    C++

    因为有重复元素存在,nums[l] <= nums[mid]不能说明[l,mid]区间内一定是单调的,比如数组[1,2,3,1,1,1,1],但是严格小于和严格大于的情况还是可以判断的。所以当nums[l] == nums[mid]时,令l++,跳过这个重复元素。所以其实该算法最坏情况下(所有元素相同)时间复杂度是(O(n))的。

    class Solution {
    public:
        bool search(std::vector<int>& nums, int target) {
            int l = 0,r = nums.size();
            while (l<r){
                const int mid = l + (r-l)/2;
                if(nums[mid] == target) return true;
                if(nums[l] < nums[mid]) // [l,mid]区间单调不降
                    if(nums[l] <= target && target < nums[mid]) r = mid; // target 在区间内
                    else l = mid + 1; // target 不在区间内
                else if(nums[mid] < nums[l]) // [mid,r]区间单调不降
                    if(nums[mid] < target && target <= nums[r-1]) l = mid + 1; // target 在区间内
                    else r = mid; // target 不在区间内
                else l++; //跳过这个重复元素
            }
            return false;
        }
    };
    

    Java

    Python3

  • 相关阅读:
    每日日报
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    Java学习
    JAVA日报
  • 原文地址:https://www.cnblogs.com/NeilThang/p/10310493.html
Copyright © 2011-2022 走看看