本道题目考察的就是最为普通的二分查找。特别需要注意的一点是,mid = (low+high)/2当low和high很大时,可能会溢出,所以最好改为mid = low+((high-low)>>1)。根据July的博文程序员编程艺术第二十五章:Jon Bentley:90%无法正确实现二分查找,如果high初始化为nums.size(),那么while判断语句就应该为low<high,下面的nums[mid]>target分支中,应该为high=mid。代码如下:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int low = 0, high = (int)nums.size()-1, mid; // 注意这里high初始化为nums.size()-1
while(low<=high) { // 注意这里是<=号
mid = low + ((high-low)>>1); // 当low和high较大时,可以防止low+high溢出
if(nums[mid] == target) {
return mid;
} else if(nums[mid] > target) {
high = mid-1;
} else {
low = mid+1;
}
}
return low; // 注意返回的是low
}
};