LeetCode 33 旋轉數組查找

一、題目分析

 要求:時間複雜度,數組中沒有重複元素,nums是升序,但是可能以未知下標旋轉,查找target的位置

解決:使用二分法,但是要加上條件限制 

 

如果不加改變繼續使用二分法,就會出現上述問題 ,怎麼加上限制條件呢

規律:

 

所以分爲下面兩種情況,一種是target在mid左邊,一種是target在mid右邊

 

 細分爲三種情況,如果begin<mid,說明這一段是遞增的;如果begin>mid,說明begin--(mid-1)是旋轉區間,當然也是遞增的;如果相等, begin==mid,就要在(mid+1)--end中去尋找

 

也就是情況分析複雜了一些,實際代碼實現如果思路清晰就不是問題,關鍵就是情況劃分好多種啊,讓人頭大 

 二、代碼實現

簡化版本,原先分了很多情況,但是網上看了別人的思路,覺得很不錯,簡單明瞭。

public class Solution {
    public int search(int[] nums, int target) {
        int start = 0;
        int end = nums.length-1;

        while(start <= end){
            int mid = (start + end) / 2;
            if(nums[mid] == target)
                return mid;
            if(nums[start] <= nums[mid]){      //如果鏈表左邊是有序的
                if(nums[start] <= target && target < nums[mid]){       //若target在鏈表左邊
                    end = mid - 1;
                }else{
                    start = mid + 1;
                }

            } else{     //否則,如果鏈表右邊是有序的
                if(nums[end] >= target && target > nums[mid]){
                    start = mid + 1;
                }else{
                    end = mid-1;
                }
            }
        }
        return -1;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章