LeetCode 熱題 HOT 100 Java題解——33. 搜尋旋轉排序陣列
LeetCode 熱題 HOT 100 Java題解
33. 搜尋旋轉排序陣列
題目:
假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [ 0 , 1 , 2 , 4 , 5 , 6 , 7 ] [0,1,2,4,5,6,7] [0,1,2,4,5,6,7] 可能變為 [ 4 , 5 , 6 , 7 , 0 , 1 , 2 ] [4,5,6,7,0,1,2] [4,5,6,7,0,1,2] )。
搜尋一個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1 。
你可以假設陣列中不存在重複的元素。
你的演算法時間複雜度必須是 O ( l o g n ) O(log n) O(logn) 級別。
示例:
輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4
二分法
一看要求需要 O ( l o g n ) O(log n) O(logn) 級別,大概率是二分法,這種旋轉的條件下其實也只是多了一些條件判斷而已,個人認為和有序陣列的二分查詢基本沒有什麼區別:
求出中點後,由於有序旋轉的特殊性質,至少有一半陣列是有序的,因此只有兩種情況:
- 左邊有序, n u m s [ s t a r t ] < = n u m s [ m i d ] nums[start] <= nums[mid] nums[start]<=nums[mid],如果 t a r g e t target target在這個範圍裡,那麼就遞迴的找左邊,否則右邊。
- 右邊有序, n u m s [ m i d ] < = n u m s [ e n d ] nums[mid] <= nums[end] nums[mid]<=nums[end],同1,情況相反。
class Solution {
public int binarySearch(int[] nums, int start, int end, int target) {
if(start > end) return -1;
int mid = (end - start) / 2 + start;
if(target == nums[mid]) return mid;
else if(nums[start] <= nums[mid]) {
if(target < nums[mid] && target >= nums[start]) return binarySearch(nums, start, mid - 1, target);
else return binarySearch(nums, mid + 1, end, target);
}
else {
if(target > nums[mid] && target <= nums[end]) return binarySearch(nums, mid + 1, end, target);
else return binarySearch(nums, start, mid - 1, target);
}
}
public int search(int[] nums, int target) {
return binarySearch(nums, 0, nums.length - 1, target);
}
}
複雜度分析
-
時間複雜度: O ( l o g n ) O(logn) O(logn)
折半查詢複雜度為 O ( l o g n ) O(logn) O(logn)。
-
空間複雜度: O ( 1 ) O(1) O(1)
由於是尾遞迴,因此優化後也只消耗常數級別的空間複雜度。
相關文章
- 力扣·33. 搜尋旋轉排序陣列力扣排序陣列
- 【LeetCode(Java) - 33】搜尋旋轉排序陣列LeetCodeJava排序陣列
- LeetCode 33——搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode 81——搜尋旋轉排序陣列 IILeetCode排序陣列
- LeetCode33. 搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode#33搜尋旋轉排序陣列LeetCode排序陣列
- LeetCode33 搜尋旋轉排序陣列LeetCode排序陣列
- leetCode33搜尋旋轉排序陣列LeetCode排序陣列
- leetcode, LC68:旋轉排序陣列搜尋LeetCode排序陣列
- LeetCode 熱題 HOT 100 Java題解——96. 不同的二叉搜尋樹LeetCodeJava
- LeetCode 刷題 [C++] 第33題. 搜尋旋轉排序陣列 (二分法+簡潔易懂)LeetCodeC++排序陣列
- 力扣-81. 搜尋旋轉排序陣列 II力扣排序陣列
- LeetCodeHot100 二分查詢 35. 搜尋插入位置 74. 搜尋二維矩陣 34. 在排序陣列中查詢元素的第一個和最後一個位置 33. 搜尋旋轉排序陣列 153. 尋找旋轉排序陣列中的最小值LeetCode矩陣排序陣列
- LeetCode每日一題: 旋轉陣列(No.189)LeetCode每日一題陣列
- 33、搜尋旋轉排序陣列 | 演算法(leetode,附思維導圖 + 全部解法)300題排序陣列演算法
- LeetCode-153-尋找旋轉排序陣列中的最小值LeetCode排序陣列
- 【LeetCode】153. 尋找旋轉排序陣列中的最小值LeetCode排序陣列
- LeetCode 熱題 HOT 100 Java題解——94. 二叉樹的中序遍歷LeetCodeJava二叉樹
- 09/05 ? LeetCode 熱題 HOT 100 -- 22, 23,31LeetCode
- LeetCode 189 旋轉陣列LeetCode陣列
- 【LeetCode】189. 旋轉陣列LeetCode陣列
- LeetCode-189-旋轉陣列LeetCode陣列
- leetcode題解(陣列問題)LeetCode陣列
- LeetCode將有序陣列轉化為二叉搜尋樹--JavaLeetCode陣列Java
- 【LeetCode Hot 100】4. 尋找兩個正序陣列的中位數LeetCode陣列
- 153. 尋找旋轉排序陣列中的最小值排序陣列
- 153. 尋找旋轉排序陣列中的最小值(中)排序陣列
- leetcode 108.將有序陣列轉換為二叉搜尋樹 JavaLeetCode陣列Java
- [LeetCode題解]79. 單詞搜尋LeetCode
- LeetCode每日一題: 按奇偶排序陣列(No.905)LeetCode每日一題排序陣列
- Leetcode 演算法題解系列 - 二維陣列快速查詢元素(二叉搜尋樹)LeetCode演算法陣列
- LeetCode刷題—陣列LeetCode陣列
- LeetCode每日一題: 按奇偶排序陣列 II(No.27)LeetCode每日一題排序陣列
- LeetCode 108. 將有序陣列轉換為二叉搜尋樹LeetCode陣列
- LeetCode-108-將有序陣列轉換為二叉搜尋樹LeetCode陣列
- LeetCode1122. 陣列的相對排序(20201114每日一題)LeetCode陣列排序每日一題
- NumPy 分割與搜尋陣列詳解陣列
- 我請大家來刷題:旋轉陣列的最小數字陣列