搜索旋轉排序數組——LeetCode刷題系列
假設按照升序排序的數組在預先未知的某個點上進行了旋轉。
( 例如,數組 [0,1,2,4,5,6,7] 可能變爲 [4,5,6,7,0,1,2] )。
搜索一個給定的目標值,如果數組中存在這個目標值,則返回它的索引,否則返回 -1 。
你可以假設數組中不存在重複的元素。
你的算法時間複雜度必須是 O(log n) 級別。
示例 1:
輸入: nums = [4,5,6,7,0,1,2], target = 0
輸出: 4
示例 2:
輸入: nums = [4,5,6,7,0,1,2], target = 3
輸出: -1
作者:fe-lucifer
鏈接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/solution/pythonjs-er-fen-fa-33-sou-suo-xuan-zhuan-pai-xu-sh/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
此處關鍵點爲時間複雜度必須是O(log n)級別,否則直接暴力遍歷即可。
本題應使用二分查找法,並且本題不是常規有序數組,變形爲了旋轉有序數組。
則解題步驟:
- 取mid
- 判斷有序和無序部分 (mid小於start,則右邊有序。mid大於等於start, 則左邊有序。)
- 判斷target在哪邊 (通過判斷有序部分中 target和邊界關係)
附上解題代碼
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function (nums, target) {
let start = 0;
let end = nums.length - 1;
while (start <= end) {
const mid = start + ((end - start) >> 1);
if(nums[mid] === target) return mid;
if(nums[start] <= nums[mid]){
//左邊有序
if(nums[start] <= target && target <= nums[mid]){
//target在左邊
end = mid -1;
}else{
//target在右邊
start = mid +1;
}
}else{
//右邊有序
if(nums[mid] <= target && target <= nums[end]){
//target在右邊
start = mid +1;
}else{
//target在左邊
end = mid -1;
}
}
}
return -1;
};