刷代码随想录
三二一一二三
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
941.有效的山脉数组
i<n-1,j>0;) {//停在最高处//停在最高处else break;=0 && j!//只有半座山也不算山脉。原创 2025-04-16 13:53:20 · 261 阅读 · 0 评论 -
1365. 有多少小于当前数字的数字
public://迭代器初始化i>=0;i--) {//从后往前遍历,相同元素的话保留最左边的。//数组哈希,覆盖全范围,元素:比他小的数量i<n;原创 2025-04-16 13:26:20 · 330 阅读 · 0 评论 -
7.2.141. 环形链表
public://双指针//直接用结论一while (q!p=p->next;原创 2025-04-15 13:23:15 · 248 阅读 · 0 评论 -
8.44. 开发商购买土地
cin>>n>>m;i<=n;i++) {j<=m;cin>>x;//从1开始就不用特判了。这相当于是同义句。//二维前缀和i<=n;i++) {//减一个得到后半部分的和。减两个的绝对值就得到前后两部分的差值//保留最小值j<=m;j++) {//纵着遍历//同理return 0;原创 2025-04-04 14:42:06 · 218 阅读 · 0 评论 -
7.58.区间和
cin>>n;i<n;return 0;原创 2025-04-04 14:01:26 · 149 阅读 · 0 评论 -
6.2.54. 螺旋矩阵
public://为空//赋值上下左右边界int u=0;int l=0;//要到头。循环里会额外留一个。//循环左闭右开。每行留一个作为下一步的起点。j<r;//上行i<d;//右列j>l;//下行i>u;//左列//成对相加减。四个边界同时往内缩。留下相等的情况单独讨论。//偶数。则会在相邻后错开。奇数,则会在相邻后相等。只要其中一对相等就会退出循环。//若同时奇数。则只需要补充一次u++;l++;d--;r--;//相等时,不用为下一个留个开头了。所以左闭右闭。原创 2025-03-31 15:36:47 · 341 阅读 · 0 评论 -
5.3.76. 最小覆盖子串
滑动窗口之最小滑窗最小滑窗字符串麻烦在组织答案,要用substr这些东西76. 最小覆盖子串 - 力扣(LeetCode)评论区里有c++版本的答案1、它是先把所有需要的量,所有的需求,比如t的长度等等求出来。遍历时一个一个减。那反过来呢?累加已有的字符数量看是否达到cnt?cnt==0当条件比较方便写吧。2、3、4、unordered_map做哈希:计数数组做哈希:原创 2025-03-30 16:35:37 · 260 阅读 · 0 评论 -
5.2.904. 水果成篮
public://用哈希存果树种类int res=0;//果树长度。i<n;i++) {//顺序遍历每棵果树.两个窗口指针while (cnt.size()>2) {//种类超过2之后,就往外扔水果。不同种类的水果都有可能扔//扔完了就删除一个水果种类j++;//扔一个,指针右移一位//从0开始,故长度为i-j+1return res;原创 2025-03-30 15:11:13 · 237 阅读 · 0 评论 -
代码随想录——数组篇总结、目录
双指针(快慢指针)用于复制数组、移除元素。主要是把n^2复杂度降到n。三指针用于搜索查找。原创 2025-03-29 16:04:26 · 198 阅读 · 0 评论 -
3.4.844. 比较含退格的字符串
public://双指针从后向前遍历//代表两个字符串'#'的数量while (i>=0) {//从后往前遍历//记录退格数else {//如果不是退格//退格发挥作用else break;//没有退格了,要比较了i--;//遍历i的做法else {//如果不是退格else break;//没有退格了。要比较了j--;//下面是主逻辑。上面是处理退格的逻辑//遍历完了至少一个。在这是整个while的出口if (s[i]!//直接判断i--;j--;原创 2025-03-29 15:47:06 · 164 阅读 · 0 评论 -
3.3.283. 移动零
public://快慢指针int j=0;i<n;i++) {//直接去掉所有重复0。去重操作。注意边界一定要下。不然会报错if (i<n) {i<n;原创 2025-03-28 21:30:36 · 201 阅读 · 0 评论 -
3.2.26. 删除有序数组中的重复项
public://快慢指针int j=1;i<n;i++) {//0不用用到。所以都从0开始遍历。return j;原创 2025-03-28 21:11:10 · 231 阅读 · 0 评论 -
2.5.367. 有效的完全平方数
public://左闭右闭while (l<=r) {//左闭右闭,相等时区间有效//l很接近右边范围极限的时候,l+r会爆。所以这里防溢出//会爆。else r=m-1;原创 2025-03-25 23:02:33 · 217 阅读 · 0 评论 -
2.4.69.x 的平方根
public://双指针左闭右闭。int ans=0;while (l<=r) {//左闭右闭,相等时区间有效//防溢出//看范围。[ (2^31-1)/2 ]^2 会爆的ans=m;//小数部分会被舍去。所以放在这边。l=m+1;else r=m-1;return ans;原创 2025-03-25 22:53:48 · 139 阅读 · 0 评论 -
2.3.34. 在排序数组中查找元素的第一个和最后一个位置
public://找右边界//根据题意,左闭右闭比较好。int rb=-2;//预设找不到。正常可能走到-1去的。所以用-2while (l<=r) {//左闭右闭,相等时有意义。//防溢出//永远想象l在最左,r在最右,mid在最中间,再根据大于小于来判断target在左区间还是右区间,就比较快if (nums[mid]>target) {//target在左区间。相等不在这边,这边是右边界。所以找的是右边界r=mid-1;} else {//相等在这边。相等时l会继续右移。原创 2025-03-25 22:38:37 · 274 阅读 · 0 评论 -
2.2.35.搜索插入位置
public://左右指针。左闭右开while (l<r) {//l==r时区间无效else r=mid;//保持区间无效return r;public://定义左右指针。左闭右闭while (l<=r) {//相等时区间有效//防溢出//保持循环不变量//找不到时有三种情况。原创 2025-03-24 12:06:58 · 256 阅读 · 0 评论 -
9.18. 四数之和
public:i<n;i++) {//一级剪枝去重//和上一道题的区别是上一道题target确定==0//去重j<n;j++) {//二级剪枝去重//双指针。左闭右闭int l=j+1;int r=n-1;while (l<r) {//左闭右闭,相等没意义else {l++;r--;return res;原创 2025-03-22 17:15:18 · 288 阅读 · 0 评论 -
9.15. 三数之和
public://先排序i<n;i++) {//选一个数为起点,在这个数后面的范围选。//剪枝。后面的数一定比这个数大。一定回不到0//去重,防止出现重复的二元组。//双指针int l=i+1;int r=n-1;while (l<r) {//左闭右闭。相等没意义。//最大值变小点//最小值变大点else {//再去重//最后执行一次。l++;r--;return res;原创 2025-03-22 16:50:07 · 180 阅读 · 0 评论 -
6.454.四数相加II
public://key:a+b的数值,value:a+b数值出现的次数mp[a+b]++;int cnt=0;//方案数累加return cnt;原创 2025-03-22 16:12:48 · 157 阅读 · 0 评论 -
5.1. 两数之和
public://key存数,value存下标i++) {//让两数之和变成找一个数。//一个一个遍历。找到了就进if (iter!=mp.end()) {//如果找到了,就返回二者的下标} //没找到就放到map里去找。return {};原创 2025-03-21 22:19:35 · 457 阅读 · 0 评论 -
4.202. 快乐数
/只是拿出来。下一步再消掉n/=10;//每一位去右移return sum;//求出每个位置上数字的平方//只有两种可能:1、是快乐数。2、进入了无限循环//还没无限循环的话就加入集合。n=sum;//更新。原创 2025-03-21 21:54:31 · 162 阅读 · 0 评论 -
3.349. 两个数组的交集
public://用迭代器,换个容器存储//用范围for遍历容器=nums.end()) {//找得到的话//临时容器。原创 2025-03-19 11:35:39 · 263 阅读 · 0 评论 -
2.242.有效的字母异位词
i++) {i<26;原创 2025-03-19 10:40:31 · 341 阅读 · 0 评论 -
5.右旋字符串
string s;cin>>k>>s;//用库函数reverse就用迭代器反转//整个都反转//左闭右开。结尾为 开头+长度return 0;原创 2025-03-19 10:07:58 · 204 阅读 · 0 评论 -
4.151.翻转字符串里的单词
public:void reverse(string& s,int st,int end) {//左闭右闭。相减就是长度i<j;i++,j--) {void rmspace(string& s) {//看代码顺序是:先走一个while(第一个单词),再加空格,再走完最后一个单词int j=0;//j指向新数组(慢指针),i指向旧数组(快指针)i<s.size();=' ') {//在每个单词的开头处开始。消除了前置空格if (j!//2复制完单词之后加后置空格。原创 2025-03-19 09:46:58 · 229 阅读 · 0 评论 -
3.替换数字
cin>>s;int cnt=0;i<s.size();i++) {//旧长度的序号//扩容。//每个数字翻6倍的长度,就是每个数字加5个长度//新长度的序号//新旧长度一起开始移动while (idx1>=0) {//从后向前填充,避免数组的移动//遇到数字的话} else {//遇到字母的话照常复制idx1--;return 0;原创 2025-03-17 23:00:10 · 372 阅读 · 0 评论 -
2.541. 反转字符串II
class Solution {//自写reverse版public://左闭右闭,用的时候就要减一i<j;i++,j--) {//双指针:奇最后指向同一个,不做处理。偶刚刚好i<s.size();i+=2*k) {//固定规律,改变循环区间即可。//对每个区间都是这个循环if (i+k<=s.size()) {//够k个,无论是否到了2k个,都直接反转前k个//左闭右闭,故加长度减一} else {//不够k个,就反转到底。//左闭右闭,故加长度减一return s;原创 2025-03-17 22:11:59 · 173 阅读 · 0 评论 -
1.344.反转字符串
i++,j--) {原创 2025-03-17 21:15:16 · 171 阅读 · 0 评论 -
13.有向图的完全可达性
/取出它的所有邻点for (int i:g[s]) {//对list里的每个邻点if (vst[i]==false) {//如果没见过的话int main()cin>>n>>m;//邻接表cin>>s>>t;i<=n;return 0;原创 2025-03-16 21:55:17 · 296 阅读 · 0 评论 -
14.岛屿周长
cin>>n>>m;i<n;i++) {j<m;i<n;i++) {j<m;j++) {if (g[i][j]==1) {//如果是陆地的话k<4;k++) {//下右上左四个方向。|| g[nx][ny]==0)//到边界或者水域的话说明是边长了res++;return 0;原创 2025-03-16 16:31:20 · 161 阅读 · 0 评论 -
10.水流问题
这就是前几道题常用的做法。会想到这样是理所当然。但是问题在于 代码随想录终止条件写在前还是写在后的问题。如果写在外部函数循环体之外,就相当于传入节点后再判断。会多递归。但是由于有vst数组的存在,标记以后不会多走错路,这和二叉树没有vst数组不一样。这是我的理解。写在循环体里面的话,在主函数开始的时候就得添上第一个数组的条件。然后再外部函数的循环体里dfs传入的就直接是合法节点了。具体见代码随想录用全局变量也有好处。才不用在每个里用g.size()。答案版本也开始用全局变量了原创 2025-03-16 15:30:25 · 432 阅读 · 0 评论 -
9.沉没孤岛
/深搜改标记g[x][y]=2;//进来之后先改了。后面可以用这个标记避免重复搜索i<4;cin>>n>>m;i<n;i++) {j<m;j++) {//把不是孤岛的都改标记i<n;i++) {j<m;j++) {//以下两步互不影响的。可以放到同一个循环里//把孤岛变成海i<=n-1;j++) {//把不是孤岛的改回来。原创 2025-03-13 00:15:28 · 274 阅读 · 0 评论 -
8.孤岛的总面积
/不是要把整个岛搜出来,而是要陆地变海洋。所以不用vst数组g[x][y]=0;//陆地变海洋。同时把相连的陆地都变成海洋。i<4;i++) {//一味跳过即可。return;cin>>n>>m;i<n;i++) {j<m;j++) {i<n;i++) {//传入起点和终点j<m;j++) {//直接总面积相加。不用搜索了int res=0;i<=n-1;原创 2025-03-12 19:37:33 · 329 阅读 · 0 评论 -
6.岛屿的最大面积
i<4;i++) {if (!num++;return;cin>>n>>m;i<n;i++) {j<m;i<n;i++) {j<m;//每块岛屿都重新计数if (!vst[i][j] && g[i][j]==1) {//对每块岛屿num++;//把所有相连陆地搜出来//检查一下i<n;i++) {j<m;原创 2025-03-12 14:26:22 · 253 阅读 · 0 评论 -
5.岛屿数量.广搜版
while (!que.pop();i<4;i++) {if (!cin>>n>>m;i<n;i++) {j<m;j++) {//标记数组防止又搜回到自己。int res=0;i<n;i++) {j<m;j++) {if (!res++;//把所有相连的陆地搜出来return 0;原创 2025-03-12 13:52:05 · 235 阅读 · 0 评论 -
5.岛屿数量.暴搜版
i<4;i++) {//用四个方向当相连边if (!//把所有相连的陆地都标记上int main()int n,m;cin>>n>>m;i<n;i++) {j<m;j++) {//标记数组防止又搜回到自己。int res=0;i<n;i++) {j<m;j++) {if (!res++;//把所有相连的陆地搜出来return 0;原创 2025-03-12 13:41:14 · 233 阅读 · 0 评论 -
3.797.所有可能的路径
i++) {//遍历其它点return;//从起点开始遍历。return res;原创 2025-03-12 03:18:04 · 242 阅读 · 0 评论 -
98. 所有可达路径
void dfs(vector<list<int>>& g,int s,int n) {//邻接表return;//邻接表for (int i:g[s]) {//与s相连的每个节点dfs(g,i,n);return;int main()//邻接表cin>>n>>m;cin>>s>>t;//起点为1,终点为ni++) {return 0;原创 2025-03-12 02:57:37 · 198 阅读 · 0 评论 -
1.739. 每日温度
class Solution {//精简写法public://栈底到栈顶递减。st.push(0);//把第一个塞进去,防空i<n;i++) {//按顺序遍历的while (!st.pop();st.push(i);return res;public://栈底到栈顶递减。st.push(0);//把第一个塞进去,防空i<n;i++) {//一直没遇到更高的温度,就入栈else {//遇到了更高的温度。对每个位置记下 下一个更高的温度。因为进去了之后可能乱序了。原创 2025-03-12 00:31:28 · 304 阅读 · 0 评论 -
49.583. 两个字符串的删除操作
class Solution {//删除的做法public://表以i-1,j-1结尾要删的最小个数//初始化i<=n;//另一个为空串。则需要全删了j<=m;i<=n;i++) {j<=m;j++) {//相同就不用删。继承上一位的操作//不相等的话就删掉class Solution {//最长公共子序列做法public:i<=n;i++) {j<=m;j++) {//不是公共子序列的部分都删掉。原创 2025-03-11 23:52:32 · 258 阅读 · 0 评论
分享