升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [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
思路:看到这个题我脑子里第一反应就是indexOf能不能解决。后来发现还真的通过了……
如果再优化一下的话,可以用二分查找。虽然整个数组是不满足二分查找的有序条件,但是当找到中间值,左边或者右边必定有一个是有序的。
代码如下:
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let left=0;
let right=nums.length-1;
while(left<=right) {
let mid = left + ((right - left) >> 1)
if(target==nums[mid]) return mid;
//如果左边小于中间,说明左边有序
if(nums[left]<=nums[mid]) {
//如果target大于左边小于中间,说明就在左边
if(target>=nums[left]&&target<nums[mid]) {
right=mid-1;
}//否则就在右边找
else {
left=mid+1;
}
}
else {
//如果target大于中间小于右边,就说明这右边
if (target>nums[mid]&&target<=nums[right]) {
left=mid+1;
}
else {
right=mid-1;
}
}
}
return -1;
};