zoukankan      html  css  js  c++  java
  • [LeetCode]26. Search in Rotated Array II旋转数组查找II

    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.

    解法:同旋转数组查找I,本题也使用二分查找,只是在nums[mid]和nums[right](或者nums[right])比较时若二者相等则left++(或者right--)即可。nums[mid]与nums[left]比较的代码:

    class Solution {
    public:
        int search(vector<int>& nums, int target) {
            int n = nums.size();
            bool res = false; 
            int left = 0, right = n - 1;
            
            while(left <= right)
            {
                int mid = ((left + right) >> 1);
                if(target == nums[mid])
                {
                        res = true;
                        break;
                }
                else if(nums[mid] > nums[left]) //前半部分有序
                {
                    if(target >= nums[left] && target < nums[mid])
                        right = mid - 1;
                    else
                        left = mid + 1;
                }
                else if(nums[mid] < nums[left]) //后半部分有序
                {
                    if(target > nums[mid] && target <= nums[right])
                        left = mid + 1;
                    else
                        right = mid - 1;
                }
                else //nums[mid]==nums[left]的情况,包括mid=left和存在重复值两种情况
                    left++;
            }
            return res;
        }
    };

    nums[mid]与nums[right]比较的代码:

    class Solution {
    public:
        int search(vector<int>& nums, int target) {
            int n = nums.size();
            bool res = false;
            int left = 0, right = n - 1;
            
            while(left <= right)
            {
                int mid = (left + right) >> 1;
                if(target == nums[mid])
                {
                        res = true;
                        break;
                }
                else if(nums[mid] < nums[right]) //后半部分有序
                {
                    if(target > nums[mid] && target <= nums[right])
                        left = mid + 1;
                    else
                        right = mid - 1;
                }
                else if(nums[mid] > nums[right]) //前半部分有序
                {
                    if(target >= nums[left] && target < nums[mid])
                        right = mid - 1;
                    else
                        left = mid + 1;
                }
                else //存在重复值的情况
                    right--;
            }    
            return res;
        }
    };
  • 相关阅读:
    gcc开启C99或C11标准支持
    数组作为参数的四种声明方式
    [BZOJ 2654]tree(陈立杰)
    [HNOI 2014]道路堵塞
    [ZJOI 2006]书架
    [NOI 2010]超级钢琴
    汇编语言语法
    [洛谷P1714]切蛋糕
    [洛谷P1440]求m区间内的最小值
    [NOIP2016 TG D2T3]愤怒的小鸟
  • 原文地址:https://www.cnblogs.com/aprilcheny/p/4882635.html
Copyright © 2011-2022 走看看