题目:https://leetcode.com/problems/search-insert-position/
- 典型的二分查找实现思路
但是需要注意,这里相当于要在数组中查找最小的、大于等于目标值的元素下标,注意更新左边界条件的方式,之前写的一篇博文中介绍了怎样更新边界以避免死循环bug。
另外还要注意,对于目标值是大于原数组中最大值和最小值得情况要特殊考虑。
我AC的代码,18.71% JAVA。
public class Solution {
public int searchInsert(int[] nums, int target) {
int begin = 0;
int end = nums.length - 1;
int mid = 0;
while(begin < end){
mid = (begin+end) >> 1;
if(target > nums[mid]){
begin = mid + 1;
}else{
end = mid;
}
}
if(nums[begin] == target){
return begin;
}else if(nums[begin] < target){
return begin + 1;
}else{
begin -= 1;
if(begin < 0){
return 0;
}
return begin + 1;
}
}
}
Discuss
代码优化
在讨论部分看到一份 beats 98% 的python代码,在二分中间比较时插入了比较多的比较,以使二分能够较快的结束。
这种比较在目标位置位于两端是会比较快,但是如果靠近中间,则会额外多一些比较次数。扩展性
代码对于duplicate元素的存在的情况也能支持,不过返回的是最小值,如果需要返回最大值,则需要采用 查找大于目标值的最小值的元素。