搜索插入位置
题目描述(难度:简单)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 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
解题思路
- 暴力法:由于数组有序,从0开始遍历,找到一个小于或等于目标值的索引,直接返回该索引,适用于数量少
- 二分法:由于数组有序,将数组用中间值分为大小区间;用目标值与中间值比较,如果大于该区间,则将中间值取为大区间的起点,重新计算中间值比较;最终当区间只有一个数的时候,比其大则返回其索引+1
代码
/**
* 暴力法
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
for(let i = 0; i < nums.length; i++) {
// 判断小于或等于当前,即返回当前位置索引
if (target <= nums[i]) {
return i;
}
}
return nums.length;
};
/**
* 二分法
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function(nums, target) {
// 二分法递归
return search(0, nums.length, nums, target);
};
/**
* 递归
*/
function fn(arr,target){
let left = 0, right =arr.length - 1;
while(left<right){
let mid = parseInt((left+right)/2);
if(target === arr[mid]){
return mid;
}else if(target < arr[mid]){
right = right -1;
}else{
left = left +1;
}
}
return left;
}