代码随想录算法训练营第二天|leetcode209 长度最小的子数组 leetcode59 螺旋矩阵Ⅱ 58. 区间和

张开发
2026/4/17 20:24:19 15 分钟阅读

分享文章

代码随想录算法训练营第二天|leetcode209 长度最小的子数组 leetcode59 螺旋矩阵Ⅱ 58. 区间和
209. 长度最小的子数组题目链接209. 长度最小的子数组 - 力扣LeetCode解题思路利用快慢指针slowfast进行区间的划分。最外层循环每次开始时都将fast进入到区间之中当sumtarget时利用slow指针不断的缩小区间的长度。代码class Solution { public: int minSubArrayLen(int target, vectorint nums) { int nnums.size(); int slow0,fast0; int sum0; int minlen100100; while(fastn) { sumnums[fast]; fast; while(sumtarget){ minlenmin(minlen, fast - slow); sum-nums[slow]; slow; } } if(minlen100100){ return 0; } return minlen; } };59. 螺旋矩阵 II题目链接59. 螺旋矩阵 II - 力扣LeetCode解题思路利用leftrighttopbottom四个指针完成对插入位置的确认。右→左res[top][i] num;//i从left到right;上→下res[i][right] num;//i从top到bottom左→右res[bottom][i] num;//i从right到left下→上res[i][left] num;//i从bottom到top代码class Solution { public: vectorvectorint generateMatrix(int n) { // 定义 n*n 二维数组初始化为0 vectorvectorint res(n, vectorint(n, 0)); int num 1; int total n * n; int top 0, bottom n - 1; int left 0, right n - 1; while (num total) { for (int i left; i right num total; i) { res[top][i] num; num; } top; //表明第一行自左向右已填充完成 for (int i top; i bottom num total; i) { res[i][right] num; num; } right--; //最右一列已填充完成 for (int i right; i left num total; i--) { res[bottom][i] num; num; } bottom--; //最后一行已完成 for (int i bottom; i top num total; i--) { res[i][left] num; num; } left; //最左一列已完成 } return res; } };58.区间和题目链接58. 区间和 | 前缀和 | 区间查询 | 代码随想录解题思路模板题代码#includebits/stdc.h using namespace std; const int N100010; int s[N]; int main() { int n; cinn; vectorint nums; for(int i0;in;i) { int cur; cincur; nums.push_back(cur); } s[0]nums[0]; for(int i1;in;i) { s[i]s[i-1]nums[i]; } int a,b; while(cinacinb) { if(a0){ couts[b]endl; }else{ couts[b]-s[a-1]endl; } } }44. 开发商购买土地题目链接44. 开发商购买土地 | 前缀和 | 矩阵划分 | 代码随想录解题思路二维数组前缀和的模板最后只需依次遍历每一种切分方式即可。代码#includebits/stdc.h using namespace std; const int N110; int a[N][N]; int s[N][N]; int main() { int min_costINT_MAX; int n,m; cinnm; for(int i1;in;i) { for(int j1;jm;j) { cina[i][j]; } } for(int i1;in;i) { for(int j1;jm;j) { s[i][j]s[i-1][j]s[i][j-1]a[i][j]-s[i-1][j-1]; } } //列举所有竖着划分的情况 int cur; for(int i1;in-1;i) { curabs(s[n][m]-s[i][m]*2); min_costmin(cur,min_cost); } for(int i1;im-1;i) { curabs(s[n][m]-s[n][i]*2); min_costmin(cur,min_cost); } coutmin_costendl; }

更多文章