代码随想录day2打卡|209.长度最小的子数组 59.螺旋矩阵II

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; 一个是没加,一个是忘记符号的意思
chatgpt对它的解释
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,耗时会小很多
在这里插入图片描述
引用一下卡哥的思维导图!!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值