LeetCode 33 搜尋旋轉排列陣列
阿新 • • 發佈:2020-11-01
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; } }