代码随想录day1|704.二分查找 27.移除元素 35.插入搜索位置
704.二分查找
- 题目链接:[https://leetcode.cn/problems/binary-search/]
文章链接:[https://programmercarl.com/0704.二分查找.html#思路] - 第一思路:二分法原理很简单,跟小学时候求根号2的值是一样的,不断夹逼,通过比较中值与目标值的大小来改变边界。
因为不知道循环的次数,所以使用while来做循环,再分别考虑大于小于等于三种情况。为了保持两边一致,用左闭右闭来写,保证初始边界,循环条件与循环体情况一致即可。
点击查看代码
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
while(left<=right){
int middle=(right+left)/2;
if(nums[middle]>target){
right=middle-1;
}
else if(nums[middle]<target){
left=middle+1;
}
else{
return middle;
}
}
return -1;
}
};
- 实现问题:第一次写时不太清除,循环条件没写一致。
- 读后想法:1.本题的重点在于保证初始边界,循环条件和循环体的一致。
2.没有注意到细节问题。int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
在这个题中其实两种写法都可以,因为题中给定了n的范围[1, 10000]
,int的最大值为2147483647,远远超出了n的范围,left + right
的最大值小于20000,不可能越界。
27.移除元素
- 题目链接:[https://leetcode.cn/problems/remove-element/]
文章链接:[https://programmercarl.com/0027.移除元素.html#思路] - 第一思路:当看到空间复杂度o(1)时,就不能在创建一个vector了(不然就很简单,一个计数器就搞定了)。快慢指针是比较好的做法。
点击查看代码
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;
for(int fast=0;fast<nums.size();fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};
- 实现问题:我居然返回值写成了
return val
,改了老半天没找到,最后发现感觉自己是个傻子。slow一直指向不重复数组的后一位(或者理解成计数器也可以),所以返回slow即可。 - 读后想法:细心细心再细心
35.插入搜索位置
- 题目链接[https://leetcode.cn/problems/search-insert-position/]
- 第一思路:一看到时间复杂度要求为logn时,就想到要用二分法。当目标值存在于数组中的时候,和二分查找没有区别。因此本题的难点在于当目标值不在数组中时插入的位置。我的想法是通过中值middle与目标值target比较大小进行判断,最后写出了结果。但是我的思考过程是错误的,只是思考了目标值位于数组中的情况,没有考虑到位于数组前端和末尾的情况,碰巧作对。
点击查看代码
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
int middle=left+(right-left)/2;
while(left<=right){
middle=left+(right-left)/2;
if(nums[middle]<target){
left=middle+1;
}
else if(nums[middle]>target){
right=middle-1;
}
else{
return middle;
}
}
if(nums[middle]>target){return middle;}
else{return middle+1;}//通过middle来判断
return middle;
}
};
- 实现问题:无
- 读后想法:遇到这种情况不要慌,要把情况进行分析,分别考虑几种情况,最后综合起来写代码,很快就能解决。如果只在脑子里乱想,是不会得出结果的。
分类:
代码随想录学算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?