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;
        }
    };
  • 相关阅读:
    ADC推荐:测量Flash的视频消费行为 (转载)
    9.7Go之函数之递归函数
    9.8线性表之单链表
    9.7线性表之顺序表
    9.7顺序表之增、删、改、查
    9.8Go之函数之计算执行时间
    9.8Go之函数之宕机(panic)
    9.9Go语言内存缓存
    9.7Go之函数之处理RuntimeError
    9.7Go之函数之defer(延迟执行语句)
  • 原文地址:https://www.cnblogs.com/aprilcheny/p/4882635.html
Copyright © 2011-2022 走看看