搜索插入位置
这也是数组系列的一道题,先看下题目。
题目要求时间复杂度O(log n),而且相关标签页提示了用二分查找。在没做题前,O(log n)这种算法就是时间减半,说白了就是二分查找法。那么既然思路已经确定了,那么就差实现代码了。来看看我的代码
public int searchInsert(int[] nums, int target) {
// 起始位置
int start = 0;
// 结束位置
int end = nums.length - 1;
// 返回结果
int result = 0;
for (int i = 0; i < nums.length; i++) {
// 计算中心点
int mid = (start + end ) / 2;
// 找到目标参数,返回下标
if(nums[mid] == target){
result = mid;
break;
}
// 如果中心点对应数字大于目标数字,则把结束位置收缩到中心点前一个位置
// 例:[1,2,3,4,5,6,7,8,9] mid=4 target=3 收缩后,其实就可以看成是[1,2,3,4] end就指到了4的位置
else if(nums[mid] > target){
end = mid-1;
}
// 与结束位置同理,把开始位置提到中心点后一个位置
else if(nums[mid] < target){
start = mid+1;
}
// 最后一次循环,处理没找到的情况
if(i == nums.length - 1){
// 目标数小于最后一个数,说明应该在数组中,这时其实正好等于起点位置。
if(target < nums[nums.length-1]){
result = start;
}else{
// 目标数字大于数组最大值或小于最小值。
//小于返回0,大于返回数组长度(数组长度正好比数组最大index大1,符合最大数插入数组的index)。
result = nums[mid] > target ? 0 : nums.length;
}
}
}
return result;
}
具体实现可以看看代码,每行基本上都已经添加到了注释。基本思路就是把代码分成两部分,第一部分就是能在数组中找到目标数。第二部分就是找不到目标数。
第二部分又分了两种情况:
- 目标数小于数组最大数,在数组中。
- 目标数大于数组最大数,或小于数组最小数。
看LeetCode的提交结果,也证明了我这种写法是正确的。
越发觉得做算法题有意思,尤其是当有目标和思路,并克服了问题时,整个人都会处于一种愉悦的状态。