代码随想录算法第二天977

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

977.有序数组的平方

题目

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/

文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html

视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep

题解

  • 第一想法:先平方后排序简单粗暴。双指针的方法没有思路。
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for(int i=0;i<nums.size();i++){
            nums[i]*=nums[i];
        }
        sort(nums.begin(), nums.end()); 
        return nums;
    }
};
  • 第二想法:看完之豁然开朗自己局限于之前遇到的指针问题只在一个数组里操作默认了该题只在一个数组中操作。

    • 按卡哥开辟新空间的方法

      class Solution {
      public:
          vector<int> sortedSquares(vector<int>& nums) {
              int len=nums.size()-1;
              vector<int> result(nums.size(),0);
              for(int i=0,j=len;i<=j;)
              {
                  if(nums[i]*nums[i]<nums[j]*nums[j])
                  {
                      result[len--]=nums[j]*nums[j];
                      j--;
                  }
                  else
                  {
                      result[len--]=nums[i]*nums[i];
                      i++;
                  }
              }
              return result;
          }
      };
      
    • 在数组原地操作

      实际操作发现只不过是另一种效率更低的暴力求解209.
      

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

题解

  • 第一想法:暴力求解,在所有子数组中找到符合条件的最短子数组

    class Solution
    {
    public:
        int minSubArrayLen(int target, vector<int> &nums)
        {
    
            int length = 0;
            int result = INT32_MAX;
            for (int i = 0; i < nums.size(); i++)
            {
                int sum = 0;
                for (int j = i; j < nums.size(); j++)
                {
                    sum += nums[j];
                    if (sum >= target)
                    {
                        length = j - i + 1;
                        result = result < length ? result : length;
                        break;
                    }
                }
            }
            return result == INT32_MAX ? 0 : result;
        }
    };
    
  • 第二想法滑动窗口:滑动窗口更符合人寻找子数组时的方式。

    • 先从头寻找符合条件的子数组
    • 找到后尝试从左侧缩减至最短,记录长度状态
    • 从找到的子数组尾部增加寻找新的子数组
    • 重复二三步,更新长度数据直到无法向尾部增加元素
    class Solution
    {
    public:
        int minSubArrayLen(int target, vector<int> &nums)
        {
            int i = 0;
            int result = INT32_MAX;
            int sum = 0;
            int length = 0;
            for (int j = 0; j < nums.size(); j++)
            {
                sum += nums[j];
                while (sum >= target)
                {
                    length = j - i + 1;
                    result = result < length ? result : length;
                    sum -= nums[i++];
                }
            }
            return result == INT32_MAX ? 0 : result;
        }
    };
    

59.螺旋矩阵

题目

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/

文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html

视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/

题解

  • 第一想法:模拟填充矩阵的过程,但是边界条件想不清楚。同时没有想到边长为奇偶数情况的分析

  • 第二想法:统一规则 ,明确边界条件

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

    主要问题就是循环边界条件的选择,以及程序思路流畅性的缺失;做题太着急,不能深入思考。

收获

  1. 对于循环,注意边界条件的选择和统一
  2. 滑动窗口的整体流程理解
posted @   烫烫烫汤圆  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示