題目: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元素的存在的情況也能支持,不過返回的是最小值,如果需要返回最大值,則需要採用 查找大於目標值的最小值的元素。