题目描述
解题思路
本题最核心的在于寻找峰值,所谓的峰值指的是该值比左边元素大,该值比右边元素也大,然后根据峰值分割数组,判断target是在数组的左边还是右边,然后使用indexOf判断位置,最后返回。
解题代码
var search = function (nums, target) {
let left = 0;
let right = nums.length - 1;
let mid = left + right >>> 1;
// 开始寻找中位数
if (nums.length > 2) {
for (let i = 1; i < nums.length; i++) {
if (nums[i] > nums[i-1] && nums[i] > nums[i+1]) {
mid = i;
break;
}
if (nums[i] < nums[i-1] && nums[i] < nums[i+1]) {
mid = i-1;
break;
}
}
}
mid
if (target < nums[mid]) {
// nums.slice(mid)
if (target < nums[0] && target <= nums[nums.length - 1]) {
if (nums.slice(mid).indexOf(target) !== -1) {
const temp = nums.slice(mid);
return temp.indexOf(target) + mid
} else {
return -1;
}
} else {
const temp = nums.slice(0, mid);
return temp.indexOf(target)
}
} else if (target === nums[mid]) {
return mid;
} else {
if (target > nums[0] && target <= nums[nums.length - 1]) {
if (nums.slice(mid).indexOf(target) !== -1) {
const temp = nums.slice(mid);
return temp.indexOf(target) + mid
} else {
return -1;
}
} else {
return -1
}
}
};
启示
- 学会通过位运算的方式求中位数。
- 学会求峰值。