大家好,继续刷题日记,这是一道数组题。来看题目要求:
(吐槽一下现在csdn改版以后插入图片真麻烦)
思路:1.第一个是暴力循环,写起来也非常简单
2.但是第一个思路效率有点低,我有点不甘心,所以继续想了二分法,这是我第一次尝试二分法写代码,成功了,很开心,运行速度beat 100%。取两个指针,begin和end,分别表示开头和结尾,temp表示两个指针的中间。首先确定target没有比end还大也没有比begin还小或跟begin一样小,循环比较就可以了,直到end - begin <= 1时停止循环,这时返回end的值。
代码1:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int len = nums.size();
for(int i = 0;i < len;i++){
if(nums[i] >= target)
return i;
}
return len;
}
};
代码2:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int len = nums.size();
if(len == 0)
return 0;
if(target > nums[len - 1])
return len;
if(target <= nums[0])
return 0;
int begin = 0;
int end = len - 1;
int temp = (begin + end)/2;
while(end - begin > 1){
if(nums[temp] == target)
return temp;
if(nums[temp] < target){
begin = temp;
temp = (begin + end)/2;
continue;
}
if(nums[temp] > target){
end = temp;
temp = (begin + end)/2;
}
}
return end;
}
};
我们下期见!