day2打卡:数组完结篇
209.长度最小的子数组
卡哥的题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。
题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE
暴力是过不了的,所以只能想其他办法><
看了好多遍视频,我觉得最大的关键就是想到快慢指针吧,也叫滑动窗口,j和i的移动过程要能自己模拟出来
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int i=0;
int sum=0;
int result=INT_MAX;
int strL=0;
for(int j=0;j<nums.size();j++){
sum+=nums[j];
while(sum>=target){
strL=j-i+1;
result=min(result,strL);
sum-=nums[i];
i++;
}
}
return result==INT_MAX ? 0 : result;
}
};
写代码遇到的问题:
1、看题目能看 但写题目感到困难 无法下笔
2、sum一开始用成了数组
3、最后的 那个 return result==INT_MAX ? 0 : result; 一个是没加,一个是忘记符号的意思
4、对于各个变量该放到程序的哪个循环附近还是有点问题
扩展题 904 水果成篮
你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。
你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:
你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。
给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。
对ddl特别多的我来说根本看不进去:
之后再看吧,这个代码我比较看的懂一点
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int n = fruits.size();
int a[100001];//瞎写的范围
int kind = 0;
memset(a,0,sizeof(a));
int left = 0;
int ans = 1;//初始化
for(int right = 0;right < n;right++)//循环右边界
{
a[fruits[right]]++;//右边界每次加一,肯定要放进right的桶里
if(a[fruits[right]] == 1)//刚放进去的,增加种类
{
kind++;
}
while(kind >= 3)
{
a[fruits[left]]--;
if(a[fruits[left]] == 0)
{
kind--;
}
left++;
//多的种类从左边不断删完,只要小于三就行
}
ans = max(ans,right - left + 1);//找最大值
}
return ans; ***Italic***
}
};
作者:wzx20110103
链接:https://leetcode.cn/problems/fruit-into-baskets/solutions/2640200/bao-mu-ji-hua-dong-shu-zu-ti-jie-904shui-r3xu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
59 螺旋矩阵
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
重要的是什么!重要的是去模拟这个矩阵的遍历过程:
要去摸清楚边界的条件和取值是什么样子的
offset startx starty 这些都要去关注
使用Vector创建二维数组:
vector<vector<int> > a3(rows,vector<int>(columns));
for(int i=0;i<rows;i++){//初始化
for(int j=0;j<columns;j++){
a3[i][j] = a1[i][j];
}
}
几乎是抄下来的代码,但还是想着练一下:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
int startx=0,starty=0;//每一个循环圈的起始位置
int loop=n/2;// 这个可以自己推算,真的这个loop和mid特别有规律,就是坐标规律
int mid=n/2;
int count=1;//开始给每一个空格赋值
int offset=1;//开始收缩,一格一格收缩
while(loop--){
int i=startx;
int j=starty;
for(j;j<n-offset;j++){
res[i][j]=count++;
}
for(i;i<n-offset;i++){
res[i][j]=count++;
}
for(j;j>starty;j--){
res[i][j]=count++;
}
for(i;i>startx;i--){
res[i][j]=count++;
}
startx++;
starty++;
offset+=1;
}
if(n%2!=0){
res[mid][mid]=count;
}
return res;
}
};
前缀和来不及看了!!
但思路真的特别好
就是区间与区间相减:
C++ 代码 面对大量数据 读取 输出操作,最好用scanf 和 printf,耗时会小很多
引用一下卡哥的思维导图!!