今天继续刷LeetCode,第35题,给定一个数,找到它在有序表中的位置,如果不存在,返回插入位置,使得仍然有序。
分析:
这个题目首先是查找,查找成功,则返回该位置下标,查找失败,就插入,并返回插入位置。可以采用直接遍历的方式,这样时间开销应该会大一点。既然是有序表,那么就可以采用二分查找的方式,加快查找速度,一但查找成功就返回下标,如果不成功就返回插入位置,这样节省很多时间。
问题:
1、二分查找的代码要熟练;
2、注意下标的表示与输出,可以有改进的地方;
附上代码:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int high=nums.size()-1;
int low=0;
int mid;
while(high>=low)
{
mid=(high+low)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]>target)
high=mid-1;
else
low=mid+1;
}
if(high<mid)
return mid;
else
return mid+1;
}
};`
另外,简化的代码:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int l = 0, r = nums.size();
while(l < r){
int m = (l + r) / 2;
if(nums[m] == target)
return m;
else if(nums[m] < target)
l = m + 1;
else
r = m;
}
return l;
}
};