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;
     }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章