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/


Follow up for “Search in Rotated Sorted Array”:
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Write a function to determine if a given target is in the array.

The array may contain duplicates.

题目分析:本题与 Search in Rotated Sorted Array唯一的区别是数组中元素可以重复,但是因为这个条件,会出现一些比较复杂的情况,影响算法的时间复杂度,原来我们依靠中间元素和边缘元素的大小关系,来判断哪些部分仍然是有序的,现在因为重复的出现,如果我们遇到中间和边缘相等的情况,我们就丢失了哪边有序的信息,因为哪边都有可能是有序的结果,不知道往哪边走。解决的办法只能是对边缘移动一步,直到边缘和中间不在相等或者相遇.

举例:假如原数组为1111115,翻转后 1151111.left=0,mid=3,target=5,A[left] == A[mid]为true,有两种可能性:

(1)A[left]到A[right]之间全部都是1

(2)A[left]到A[right]之间存在不同的数字,可能包括target,无法确定属于那种情况。

若翻后数组为11111111...115.,或者为全1,有最坏的时间复杂度O(n);

 public boolean search(int[] nums, int target) {
            int len=nums.length;
            int left=0;
            int right=len-1;
            while(left<=right){
                int mid=(left+right)/2;
                if(nums[mid]==target)
                    return true;
                if(nums[mid]<nums[left]){
                    if(nums[mid]<target&&nums[right]>=target){
                        left=mid+1;
                    }
                    else{
                        right=mid-1;
                    }
                }
                else if(nums[mid]>nums[left]){
                    if(nums[mid]>target&&nums[left]<=target)
                        right=mid-1;
                    else{
                        left=mid+1;
                    }
                }
                else{
                    left++;
                }
            }
            return false;
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值