1. 程式人生 > 實用技巧 >LeetCode 33 搜尋旋轉排列陣列

LeetCode 33 搜尋旋轉排列陣列

LeetCode33 搜尋旋轉排列陣列

題目描述

給你一個升序排列的整數陣列 nums ,和一個整數 target

假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。(例如,陣列 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1,2] )。

請你在陣列中搜索 target ,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1

樣例

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

演算法分析

  • 二分找旋轉點,中點與末端點是保持單調性質(具體性質就是是否大於nums[0])
  • 確定是左還是右區間
    • >= nums[0] 左區間,<nums[0],右區間
  • 在區間內再次二分找target,找到返回左邊,找不到返回-1

時間複雜度\(O(log(n))\)

Java程式碼

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

        //
        int l = 0, r = nums.length - 1;
        while( l < r ){
            int mid = l + r + 1 >> 1;
            if(nums[mid] >= nums[0]) l = mid;
            else r = mid - 1;
        }

        //找到左區間或者是右區間
        if(target >= nums[0]) l = 0;
        else{
            l = r + 1;
            r = nums.length - 1;
        }


        while(l < r){
            int mid = l + r >> 1;
            if(nums[mid] >= target ) r = mid;
            else l = mid + 1;

        }

        if(nums[r] == target ) return r;
        else return -1;
    }
}