LeetCode---81. Search in Rotated Sorted Array II

LeetCode—81. Search in Rotated Sorted Array II

题目

https://leetcode.com/problems/search-in-rotated-sorted-array-ii/description/
给出一个升序排列的数组,注意是非严格升序,可以有重复元素,然后数组旋转,得到将要操作的数组(i.e., [0,0,1,2,2,5,6] might become [2,5,6,0,0,1,2]).,给出一个整数,判断该数是否存在于数组中,若是,返回true,否则false。例子:

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

思路及解法

这道题是33.Search in Rotated Sorted Array的升级版。在33那道题里我们的思路是先根据nums[left]和nums[mid]的大小关系判断那边有序,然后判断target是否在有序的那边,如果是,则在有序的一边寻找,否则在另一边寻找,这样实现了logN的时间复杂度。但是这道题的数组里的元素可以是重复的,也即是nums[left]和nums[mid]有可能是相等的,例如假设原数组是{1,2,3,3,3,3,3},那么旋转之后有可能是{3,3,3,3,3,1,2},或者{3,1,2,3,3,3,3},这样的我们判断左边缘和中心的时候都是3,如果我们要寻找1或者2,我们并不知道应该跳向哪一半。这样就会导致我们有可能不能判断左右两侧到底那边是有序的,也就无法获知应该从那边开始寻找,所以我们要针对相等的情况单独讨论,在这种情况下,想到的方法是left++,直到可以判断出大小,否则一直循环到结束。时间复杂度On。

代码

class Solution {
    public boolean search(int[] nums, int target) {
        int left = 0;
        int mid = 0;
        int right = nums.length - 1;
        while(left <= right){
            mid = (left+right)/2;
            if(target == nums[mid])
                return true;
            if(nums[left] < nums[mid]){//左侧有序
                if(target<nums[mid] && target>=nums[left])
                    right = mid - 1;
                else
                    left = mid + 1;
            }else if(nums[left] > nums[mid]){//右侧有序
                if(target>nums[mid] && target<=nums[right])
                    left = mid + 1;
                else
                    right = mid - 1;
            }else{
                left++;
            }
        }
        return false;
    }
}

猜你喜欢

转载自blog.csdn.net/pnnngchg/article/details/80217092
今日推荐