leetcode33题
搜索旋转排序数组题述:
在传递给函数之前,
nums在预先未知的某个下标k(0 <= k < nums.length)上进行了 旋转,使数组变为[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如,[0,1,2,4,5,6,7]在下标3处经旋转后可能变为[4,5,6,7,0,1,2]给定一个n个元素有序的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。
解题方法:
通过旋转后的数组,取中间索引的值,总是会存在要么左半部分有序,要么右半部分有序。
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let left = 0
let right = nums.length - 1
while(left <= right) {
const middle = Math.floor((left + right) / 2)
if (target === nums[middle]) return middle
// 左半部分有序
if (nums[left] <= nums[middle]) {
// 目标定位在左半部分
target >= nums[left] && target < nums[middle] ? (right = middle - 1) : (left = middle + 1)
} else {
// 左半部分无序那么右半部分一定是有序的
// 目标定位在右半部分
target> nums[middle] && target <= nums[right] ? (left = middle + 1) : (right = middle - 1)
}
}
return -1
}