LeetCode系列之 (JavaScript) => 35. 搜索插入位置
题目描述:
解题思路分析:
考虑四种情况:
- 目标值在数组所有元素之前
- 目标值在数组所有元素之后
- 目标值存在于数组中
- 目标值在数组的范围内,但是不存在
针对第三种和第四种情况,可以考虑找到大于等于目标值的索引号,即满足条件。
另外,可以考虑用二分法,需要确定“循环不变量”(即区间定义)
不同解法:
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
// 暴力解法
var searchInsert = function(nums, target) {
if(target < nums[0]){
return 0;
}else if(target > nums[nums.length-1]){
return nums.length;
}else{
//只需要找到第一个大于等于target的就行
// for(var i = 0; i<nums.length; i++){
// if(nums[i] >= target){
// return i;
// }
// }
var ind = nums.findIndex(v => {return v>=target});
return ind;
}
};
//二分法
var searchInsert = function(nums,target){
var leftInd = 0;
var rightInd = nums.length-1;
// 定义target 实在闭合区间[leftInd,rightInd]
while(leftInd <= rightInd){
var midInd = leftInd + ((rightInd-leftInd) >> 1); //防止内存溢出 // 当区间只剩下偶数个的时候,中点取的是左边端点
if(nums[midInd] > target){ //表示target在左区间
rightInd = midInd - 1;
}else if(nums[midInd] < target){ //表示target在右区间
leftInd = midInd + 1;
}else if(nums[midInd] == target){
return midInd;
}
}
return leftInd;// 结束循环时,当前的位置即为要返回的值
//或 return rightInd + 1;
}
//大牛 solution - 二分法
// 考虑半开半闭区间 [leftInd, rightInd)
var searchInsert = function(nums,target){
var leftInd = 0;
var rightInd = nums.length; // 不同于上个方法
if(nums.length == 0){
return 0;
}
while(leftInd < rightInd){
var midInd = leftInd + ((rightInd-leftInd) >> 1);
if(nums[midInd] == target){
return midInd;
}else if(nums[midInd] > target){
rightInd = midInd;
}else if(nums[midInd] < target){
leftInd = midInd+1;
}
}
return leftInd; // 结束循环的时候,leftInd和rightInd相等
}
本文来自博客园,作者:77工作室,转载请注明原文链接:https://www.cnblogs.com/z7luv/p/15936726.html
如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。