33. Search in Rotated Sorted Array
Tags
- Array
- Binary Search
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e.,
0 1 2 4 5 6 7
might become4 5 6 7 0 1 2
).You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
题意:
假设一个按升序排序的数组在预先未知的某个旋转轴上旋转。 (即0 1 2 4 5 6 7 可能变为 4 5 6 7 0 1 2)。 给你一个搜索的目标值。如果在返回的数组索引,否则返回-1。 你可以假设没有重复的数在数组中存在。
分析:
一看到题意就打算使用折半查找法,不过题目中说升序数组可能中途折断,不是一直升序的,因此我们在折半查找时需要多做一些条件判断。具体详见代码。
思路:
折半查找法
复杂度:
时间复杂度O(log(n));
Js实现:
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let lo = 0;
let hi = nums.length - 1;
while (lo < hi) {
let mid = Math.floor((lo + hi) / 2);
if (nums[mid] == target) return mid;
// 升序
if (nums[lo] <= nums[mid]) {
//目标值大于最小位的值且小于中位值
if (target >= nums[lo] && target < nums[mid]) {
hi = mid - 1;
} else {
lo = mid + 1;
}
} else {
// 折断位置
//目标值大于中位值且小于最后位置值
if (target > nums[mid] && target <= nums[hi]) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
}
return nums[lo] == target ? lo : -1;
};