题目描述
解题思路
本题最核心的在于寻找峰值,所谓的峰值指的是该值比左边元素大,该值比右边元素也大,然后根据峰值分割数组,判断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 } } }; 复制代码
启示
- 学会通过位运算的方式求中位数。
- 学会求峰值。
通过截图