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

    题目

    在一个旋转数组里,进行二分。但是会有重复的元素。

    二分的关键在于判断当前的中点 mid 是在数组旋转点的左边还是右边,当有重复的元素的时候,当nums[mid]==nums[l] && nums[mid]==nums[r]

    的时候,是判断不出来的,只能递归了,左边右边都走一下。

    class Solution {
    public:
        bool search(vector<int>& nums, int target) {
    
            if(nums.size()==0)
                return false;
    
            return dfs(nums,0,nums.size()-1,target);
    
        }
    
        bool dfs(vector<int>& nums,int l,int r,int target)
        {
            while(l<r)
            {
                int mid = (l+r)/2;
    
                if(target == nums[mid])
                    return true;
                if(nums[mid]==nums[r]&&nums[mid]==nums[l])
                {
                    bool res = dfs(nums,l,mid-1,target);
                    if(res==true)
                        return true;
                    res = dfs(nums,mid+1,r,target);
    
                    if(res==true)
                        return true;
                    return false;
                }
                if((nums[mid]>nums[r]&&nums[mid]>=nums[l]))
                {
                    if(target<nums[mid])
                    {
                        if(target==nums[l])
                            return true;
                        else if(target < nums[l])
                        {
                            l = mid+1;
                            continue;
                        }
                        else
                        {
                            r = mid-1;
                            continue;
                        }
                    }
                    else
                    {
                        l=mid+1;
                        continue;
                    }
                }
                else if((nums[mid]<=nums[r]&&nums[mid]<nums[l]))
                {
                    if(target>nums[mid])
                    {
                        if(target==nums[r])
                            return true;
                        else if(target > nums[r])
                        {
                            r = mid-1;
                            continue;
                        }
                        else
                        {
                            l=mid+1;
                            continue;
                        }
                    }
                    else
                    {
                        r = mid-1;
                        continue;
                    }
                }
                else if(nums[mid]<=nums[r]&&nums[mid]>=nums[l])
                {
                    if(target>nums[mid])
                    {
                        l=mid+1;
                    }
                    else
                    {
                        r=mid-1;
                    }
                    continue;
                }
            }
            if(target==nums[l])
                return true;
            return false;
        }
    };
    
  • 相关阅读:
    [转]难过的时候看看,也许会豁然开朗
    热爱生活
    [转]MTOM 编码
    11/16
    11/10 The Day Before Single's Day
    About working overtime
    hehe
    The First Blog
    配置MapServer出现的一些问题及解决办法
    Ubuntu 系统下终端快捷键设置
  • 原文地址:https://www.cnblogs.com/dacc123/p/11841713.html
Copyright © 2011-2022 走看看