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

    给定一个数组,数组是升序排列的,然后现在被循环右移了 n 个单位长度(n未知),且:数组中的元素可重复。给定一个target,求给定的数是否存在于数组中。

    Input: nums = [2,5,6,0,0,1,2], target = 0
    Output: true


    思路:
    此题跟第33题Search in Rotated Sorted Array 很相似,但区别在于,此题元素可重复,同样和33题一样,采用二分查找。
    难点:
    对于[1,1,1,3,1]和[1,3,1,1,1],target = 3时,对于nums[mid] = 1, 其 nums[left] = nums[right] = 1,而3既可以在mid左边,又可以在mid右边。所以,对于这种时候,算法就失灵了。解决办法就是这个时候就转为普通的遍历将nums[mid]与nums[right]比较,当相等时,right--;当nums[mid] > nums[right]时,说明左边是有序的,此时判断target是否属于有序的这一边;当nums[mid] < nums[right]时,说明右边是有序的,此时判断target是否属于有序的这一边。

    class Solution {
    public:
        bool search(vector<int>& nums, int target) {
            int n = nums.size(), left = 0, right = n - 1;
            while (left <= right) {
                int mid = (left + right) / 2;
                if (nums[mid] == target) return true;
                if (nums[mid] < nums[right]) {//右边是有序的
                    if (nums[mid] < target && nums[right] >= target) left = mid + 1;
                    else right = mid - 1;
                }
                else if (nums[mid] > nums[right]) {//左边是有序的
                    if (nums[mid] > target && nums[left] <= target) right = mid - 1;
                    else left = mid + 1;
                }
                else right--;//相等时转为普通的遍历
            }
            return false;
        }
    };
  • 相关阅读:
    Cpp Chapter 12: Classes and Dynamic Memory Allocation Part1
    Cpp Chapter 11: Working with Classes Part2
    Cpp Chapter 11: Working with Classes Part1
    Cpp Chapter 10: Objects and Classes Part2
    摄影技术学习
    安装texlive2017(latex的编译软件)
    文献管理工具的使用(Mendeley和Endnote)
    函数的级数展开和渐近展开
    常用英语语法小结
    常微分方程
  • 原文地址:https://www.cnblogs.com/luo-c/p/13033112.html
Copyright © 2011-2022 走看看