给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
在 JS 中,可以直接使用 indexOf 解决:
var search = function(nums, target) {
return nums.indexOf(target)
}
所以,尝试去实现 JS, indexOf方法。
方法一:常规解决方案,遍历数组,当出现时 return 下标,当数组遍历到大于该数时没有出现该数字则 return -1。
var search = function(nums, target) {
for(let index = 0 ; index < nums.length; index++) {
const num = nums[index]
if (num === target) {
return index
} else if (num > target) {
return -1
}
}
return -1
}
方法二:二分法
通过图解和判断可以得知以下可以省去遍历的步骤:
1.当左侧遍历 < 目标值时,没有必要遍历左侧元素
2.当右侧遍历 > 目标值时,没有必要遍历右侧元素
3.两侧都满足 1,2两个条件时候,返回 -1
4.左侧遍历至下标0,右侧遍历至结束如果没有匹配,则返回 -1
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let mid = Math.floor(nums.length / 2)
let left = mid - 1
let right = mid + 1
if ( nums[mid] === target) {
return mid
}
let isLeft = nums[left] >= target
while((isLeft && left >= 0)) {
if (nums[left] === target) {
return left
}
left--
}
while(!isLeft && right <= nums.length) {
if (right <= nums.length - 1 && nums[right] === target) {
return right
}
right++
}
return -1
};