33. 搜尋旋轉排序陣列(分治思維)
阿新 • • 發佈:2020-12-05
33. 搜尋旋轉排序陣列
給你一個整數陣列 nums
,和一個整數 target
。
該整數陣列原本是按升序排列,但輸入時在預先未知的某個點上進行了旋轉。(例如,陣列 [0,1,2,4,5,6,7]
可能變為 [4,5,6,7,0,1,2]
)。
請你在陣列中搜索 target
,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1
。
示例 1:
輸入:nums = [4,5,6,7,0,1,2], target = 0
輸出:4
示例 2:
輸入:nums = [4,5,6,7,0,1,2], target = 3
輸出:-1
示例 3:
輸入:nums = [1], target = 0 輸出:-1
提示:
-
1 <= nums.length <= 5000
-
-10^4 <= nums[i] <= 10^4
-
nums
中的每個值都 獨一無二 -
nums
肯定會在某個點上旋轉 -
-10^4 <= target <= 10^4
解題思路:由遞迴實現的分治法
- 若要在有序部分查詢使用二分法即可
- 若要在無序部分查詢則此子問題為原問題的一個規模較小的子問題
由於題目說數字了無重複,舉個例子:
1 2 3 4 5 6 7 可以大致分為兩類,
第一類(前半部分有序後半部分無序)
2 3 4 5 6 7 1 這種,也就是 nums[start] <= nums[mid]
2 <= 5
。
這種情況下,前半部分有序。因此如果 nums[start] <=target<nums[mid]
,則在前半部分找,否則去後半部分找。
第二類(前半部分有序後半部分無序)
6 7 1 2 3 4 5 這種,也就是 nums[start] > nums[mid]
。此例子中就是 6 > 2
。這種情況下,後半部分有序。因此如果 nums[mid] <target<=nums[end]
,則在後半部分找,否則去前半部分找。
第三類(前後部分都有序,偶數情況下,eg56781234)
此題有個存在重複數字的變形題,可參考 此題解 。
實現(golang):