给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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
我的算法实现:
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function (nums, target) {
for (let i = 0; i < nums.length; i++) {
if (nums[i] >= target) {
return i
}
}
return nums.length
}
这道题,看到的第一想法是使用二分搜索的方式,毕竟数组是有序的,但是过后发现实现起来并不是很容易,当然我并没有真正的把这个数组先变成二分搜索的结构,而是采取中间搜索法,就像快速排序那样,但是我并没有想好,导致最后尝试几次都失败了,于是我使用了传统的方法实现了这个方法。
下面这个是我最先开始想实现的,可惜我没想法就开始写代码了,结果头搞大了:
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left <= right) {
int mid = (left + right) / 2;
if(nums[mid] == target) {
return mid;
} else if(nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
}
}
这个算法的优化也是属于我曾经说的那种,那就是“少做无用功”,如果能够在遍历相对更少的次数就能得到结果,说明做的无用功,这其实也是聪明的一种体现。比如学生时代分座位,当你知道同学们的身高的时候,你怎么使用最快的速度算出你坐的位置。
来源:力扣(LeetCode)