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

    https://leetcode.com/problems/search-in-rotated-sorted-array-ii/

    对于一个有序数组,将其元素以某一个元素为轴进行旋转,比如[0,1,2,3,4,5,6,7]可能会变成[4,5,6,7,0,1,2,3]
    求这个经过旋转的数组中是否存在有值等于target,如果有的话就返回其true,如果没有就返回false;数组中存在重复值

    这里与search-in-rotated-sorted-array类似,也是先找到分界点,然后确定target在左边还是在右边;
    注意点:

    • 找最小值分界点时,由于存在重复值,需要在while循环加入 nums[lo]>=nums[hi] 判断,此时跳出循环后 hi 和 lo不一定相等
    • 找到最小值分界点后,判断target在左边还是右边
    • 去掉多余的重复值
    • 再用一个二分查找去判断 target 是否存在
    class Solution {
    public:
        bool search(vector<int>& nums, int target) {
            int lo = 0, hi = nums.size()-1;
            if(hi==-1)
                return false;
            while(lo < hi && nums[lo] >= nums[hi])
            {
                int mi = (lo + hi)>>1;
                if (nums[mi]<nums[hi])
                    hi = mi;
                else if(nums[mi] > nums[hi])
                    lo = mi + 1;
                else
                    lo = lo + 1;
            }
    
            if(target <= nums[nums.size()-1])
            {
                lo = lo; hi = nums.size()-1;
            }
            else
            {
                hi = lo-1;
                lo = 0;
            }
            
            while(hi>=1 && nums[hi]==nums[hi-1])
                if(nums[hi]==target)
                    return true;
                else
                    hi-=2; //同时去掉两个相同的数值
            while(lo < hi)
            {
                int mi = (lo + hi)>>1;
                if (nums[mi] < target)
                    lo = mi + 1;
                else
                    hi = mi;
            }
            return nums[lo]==target;
        }
    };
    

    结果:

    Runtime: 4 ms, faster than 98.90% of C++ online submissions for Search in Rotated Sorted Array II.
    Memory Usage: 7.9 MB, less than 100.00% of C++ online submissions for Search in Rotated Sorted Array II.

  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/qiulinzhang/p/12530127.html
Copyright © 2011-2022 走看看