题目描述:来源(https://leetcode-cn.com/problems/search-insert-position/)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
法一:
其实这个题的思路很简单,最常规的做法就是一个个的判断,只要数组中的值大于等于target时就可以返回此时的下标了,如果都不满足说明应该是最大的数,直接返回整个数组的长度就行,代码很简单。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
for(int i=0;i<nums.size();i++)
{
if(target>=nums[i])
return i;
}
return nums.size();
}
};
此时提交的时间为12ms,空间为8.9MB
法二:
当然上述的方法并不是最优的,我们可以赢二分法改进下,先判断中间位置的数跟target的大小,如果target更大,则改变左值left为中间位置加一,否则改变右值为中间位置。循环条件是left<right,退出循环时left一定等于right,只要返回其中一个就行。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left=0,right=nums.size();
while(left<right)
{
int mid=(left+right)/2;
if(nums[mid]<target)
left=mid+1;
else
right=mid;
}
return left;
}
};
采用法二的时间减少为8ms,空间不变。
改进:在上述的基础上不难想到,我们其实可以先判断两个特殊情况,就是第一个元素也大于target时和最后一个元素也小于target时,可以直接返回0和数组长度,虽然会增加一定的时间,但是当碰到这种特殊情况时,也能节约大量的时间。
改进后的时间为4ms,空间稍变大为9MB。