代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

状态:不熟练啊呜呜呜呜呜呜
时长:2h40min别骂了啊啊啊啊啊啊啊啊菜菜
977.有序数组的平方 

题目建议: 本题关键在于理解双指针思想 

蒙眼:想不到怎么一遍for代替两遍for,只能是先平方后bubblesort手动狗头

sos!在看视频的时候发现丢了一个条件!从负到正生序排列

下次多观察!

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> results(nums.size());
        int k = nums.size()-1;
        for(int i = 0, j = nums.size()-1; i<=j;){
            if((nums[i]*nums[i])>=(nums[j]*nums[j])){
                results[k--] = nums[i]*nums[i];
                i++;
            }else{
                results[k--] = nums[j]*nums[j];
                j--;
            }
        }
        return results;
    }

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文章讲解:代码随想录

视频讲解: 双指针法经典题目 | LeetCode:977.有序数组的平方_哔哩哔哩_bilibili

 209.长度最小的子数组

状态:终于做到了滑动窗口哇酷哇酷!

暴力:枚举所有区间情况求和,比大小。O(n^2)

子数组意思是顺序不变,好好好,我阅读理解真不错

题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。  拓展题目可以先不做。 

滑动窗口:

  • 如何移动起始位置
  • 本人认为,仅这道题而言(避免underfitting),采用滑动窗口是出于观察最小子序列是数字本身,最大子序列是完整序列。所以想法是看看最大窗口能收缩到哪。(我第一遍读题以为是抽取数字所以没解对)

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文章讲解:代码随想录

视频讲解:拿下滑动窗口! | LeetCode 209 长度最小的子数组_哔哩哔哩_bilibili

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0;
        int i = 0;
        int subL = 0;
        for(int k = 0; k<nums.size();k++){
            // end position
            sum+=nums[k];
            subL++;
            while(sum>=target){
                sum-=nums[i++];
                // move start position
                subL--;
                result = result < subL ? result : subL;
            }
        }
        if(result==INT32_MAX) return 0;
        else{
            return result+1;
        }
    }
};

全局最优:因为总能有机会更新到最小。

 59.螺旋矩阵II

题目建议:  本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。 

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
          vector<vector<int>> matrix(n, vector<int>(n));
          // [)
          int offset = 0;
          int i, j = 0;
          int count = 1;
          int iter = n;
          while(iter/2>0){
              for(j=offset;j<n-offset-1;j++){
                  matrix[i][j]=count++;
              }
              for(i=offset;i<n-offset-1;i++){
                  matrix[i][j]=count++;
              }
              for(j=n-offset-1;j>offset;j--){
                  matrix[i][j]=count++;
              }
              for(i=n-offset-1;i>offset;i--){
                  matrix[i][j]=count++;
              }
            offset++;
            i=offset;
            j = offset;
            iter-=2;
          }
    
         if ((n & 1) == 1) {
             matrix[n/2][n/2] = count;
         }
          return matrix;
    }
};

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

文章讲解:代码随想录

视频讲解:一入循环深似海 | LeetCode:59.螺旋矩阵II_哔哩哔哩_bilibili

有点小粗心:走位题要考虑循环最后落脚在哪(因为会有跳出循环到判断,要知道下一次从哪里走)这道题主要是区间范围。

总结:

呃呃光是练了5题感觉容易underfitting。只练习了双指针,大体上逻辑是一遍for循环代替两遍for循环。一个用于遍历,一个动态调整。数组还需要注意区间,合法区间的概念很重要,注意n/2都取下界,所以一般左闭,右边开不开保持一致就行,哈哈,熟练就好。

key concepts:

滑动窗口,区间

先这样,哈哈

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值