1. 程式人生 > 實用技巧 >33. 搜尋旋轉排序陣列(分治思維)

33. 搜尋旋轉排序陣列(分治思維)

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):