1. 程式人生 > >LeetCode筆記——33搜尋旋轉排列陣列

LeetCode筆記——33搜尋旋轉排列陣列

題目:

假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。

( 例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

搜尋一個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。

你可以假設陣列中不存在重複的元素。

你的演算法時間複雜度必須是 O(log n) 級別

示例 1:

輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4

示例 2:

輸入: nums = [4,5,6,7,0,1,2], target = 3
輸出: -1

思路:我直接看了網上大神的寫法。要求的時間複雜度必須是 O

(log n),所以使用二分法來做。題目中的旋轉實際上就是左右兩個部分調換,變成了兩個有序的部分。

程式碼:

class Solution {     public int search(int[] nums, int target) {        if(nums.length==0)        { return -1; }         int st = 0,end = nums.length-1;         while(st <= end)         { int mid = st+(end-st)/2;          if(nums[mid]==target)          { return mid; }          if(nums[mid]>=nums[st])             {    if(nums[st]<=target&&target<nums[mid]

)                    { end = mid-1; }                   else{ st = mid+1; }          }else                 { if(nums[mid]<target&&target<=nums[end])                 { st = mid+1; }                  else{ end = mid==0?mid:mid-1; }          }         }         return -1;

   } }

執行最快的程式碼

基本上也是二分法的思想

class Solution {
    public int search(int[] nums, int target) {
        if (nums == null || nums.length == 0) return -1;
        int start = 0, end = nums.length - 1;
        while (start < end) {
            int mid = (start + end) / 2;
            if (nums[mid] > nums[end]) {  // eg. 3,4,5,6,1,2
                if (target > nums[mid] || target <= nums[end]) {
                    start = mid + 1;
                } else {
                    end = mid;
                }
            } else {  // eg. 5,6,1,2,3,4
                if (target > nums[mid] && target <= nums[end]) {
                    start = mid + 1;
                } else {
                    end = mid;
                }
            }
        }
        if (start == end && target != nums[start]) return -1;
        return start;
    }
}