题目:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例:
- 示例 1
输入: [1,3,5,6], 5
输出: 2
- 示例 2
输入: [1,3,5,6], 2
输出: 1
- 示例 3
输入: [1,3,5,6], 7
输出: 4
- 示例 4
入: [1,3,5,6], 0
输出: 0
抛砖引玉
- 这样太简单了吧直接循环相等的就返回索引
- 小于就记录索引+1
- 大于就直接终止循环
撸起
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var isBipartite = function (graph) {
let _result = 0
nums.some(function (val, index) {
if (val === target) {
_result = index
} else if (val <= target) {
_result = index + 1
} else {
return true
}
})
return _result
}
这个 时间 13.3% ,内存 8.7%是什么意思
优化
使用二分法查找优化下查找的逻辑
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function (nums, target) {
let len = nums.length,
_result = len,
left = 0,
right = len - 1
while (left <= right) {
let index = parseInt((right - left) / 2, 10) + left
if (target <= nums[index]) {
_result = index
right = index - 1
} else {
left = index + 1
}
}
return _result
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i0lxNzgb-1594950842935)(http://qiniu.gaowenju.com/leecode/20200717-2.png)]
优化了时间 那空间呢,减少下中间的变量,遇到结果就直接返回
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function (nums, target) {
let left = 0,
right = nums.length - 1,
index = 0
while (left <= right) {
index = parseInt((right - left) / 2, 10) + left
if (nums[index] === target) return index
if (left === right) return nums[index] > target ? index : index + 1
if (target > nums[index]) left = index + 1
else right = index
}
}
博客: 小书童博客
公号: 坑人的小书童