**题目 :**给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素
输入: [1,3,5,6], 5
输出: 2
输入: [1,3,5,6], 2
输出: 1
输入: [1,3,5,6], 7
输出: 4
输入: [1,3,5,6], 0
输出: 0
方法一:
思路:查找目标值在数组中的位置,如果查到返回下标,如果找不到就把元素放入数组中,排序新元素,然后用findIndex查找出排序后元素的位置;
var searchInsert = function(nums, target) {
var index ,arr = [];
for(var i = 0;i<nums.length;i++){
if(nums[i] == target){
return index = i ;
}
}
if(!index){
arr = nums.concat(target);
arr.sort((a,b) => {
return a-b
})
}
index = arr.findIndex((elem,i) => {
return elem == target
})
return index ;
};
方法二:
思路:目标值和数组第一个元素比较,如果小于第一个元素直接返回0
数组中的元素如果大于等于目标值,直接返回下标
数组中的所有元素小于目标值,那么直接返回循环后的i;
var searchInsert = function (nums, target) {
if (target<nums[0]) return 0; // 目标值小于第一位数,返回下标 0
for (var i = 0; i<nums.length;i++){ // 大于等于目标值 返回i
if (nums[i]>=target) return i; //跳出循环
}
return i; // 直接返回i 数组的长度
};
var nums = [1,3,5,6] ,target = 5; // =>2
var nums = [1,3,5,6] ,target = 2; // =>1
var nums = [1,3,5,6] ,target = 7; // =>4
var nums = [1,3,5,6] ,target = 0; // =>0
var a = searchInsert(nums,target);
方法三:出题的目的,利用下标中位数
//方法三:
var searchInsert = function (nums, target) {
var len = nums.length;
if (nums[len - 1] < target) {
return len;
}
let left = 0;
let right = len - 1;
while (left <= right) { //当左边的小于等于右边的
let middle = Math.round((left + right) / 2);
// console.log(middle)
if (nums[middle] == target) {
return middle;
} else if (nums[middle] < target) {
left = middle + 1;
} else {
right = middle - 1;
}
}
return left;
};
var nums = [1,3,5,6] ,target = 5; // =>2
// var nums = [1,3,5,6] ,target = 2; // =>1
// var nums = [1,3,5,6] ,target = 7; // =>4
// var nums = [1,3,5,6] ,target = 0; // =>0
var a = searchInsert(nums,target);
console.log(a)