整数数组 nums
按升序排列,数组中的值 互不相同 。
在传递给函数之前,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]
。
给你 旋转后 的数组 nums
和一个整数 target
,如果 nums
中存在这个目标值 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
题解
- 方法一:数组从 k 开始两边分别有序
- 从左开始遍历查找,或者从右开始遍历查找
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
if(target > nums[0]) { // k 的左边从下标 0 开始升序
for(let i = 0; i < nums.length; i++) { // 遍历
if(target == nums[i]) {
return i;
}
if(target < nums[i]) {
break;
}
}
}
else if(target < nums[0]) { // k 的右边从最后一个向前降序,且右边的数全部小于左边的数
for(let i = nums.length - 1; i > 0; i--){ // 遍历
if(target == nums[i]) {
return i;
}
if(target > nums[i]) {
break;
}
}
}
else return 0;
return -1;
};
- 方法二:二分法查找变形
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
if(nums.length == 0) return -1;
let letf = 0;
let right = nums.length - 1;
while (letf <= right) { // 二分法
let mid = parseInt((right + letf) / 2);
if (nums[mid] == target) return mid;
else if (nums[mid] >= nums[letf]) { // mid 左边是顺序排列
if (nums[mid] > target && nums[letf] <= target) right = mid - 1;
else letf = mid + 1;
} else { // mid 右边顺序排列
if (nums[mid] < target && nums[right] >= target) letf = mid + 1;
else right = mid - 1;
}
}
return -1;
};
- 方法三:直接使用
indexOf
查找 : )
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
return nums.indexOf(target);
};