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


    LeetCode 977.有序数组的平方

    题目链接:977.有序数组的平方

    思路:
    1、先对每个数进行遍历平方,并插入新的容器中
    2、对容器进行排序,返回就可以了

    缺陷:开辟了新的容器空间

    class Solution {
    public:
        vector<int> sortedSquares(vector<int>& nums) {
            vector<int> v;
            for (int i = 0; i < nums.size(); i++) {
                v.push_back(pow(nums[i],2));
            }
            sort(v.begin(), v.end());
            return v;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述
    思路:
    写此博客的过程中,突然想到我为什么还要重新开辟容器空间,直接在原数据上进行操作不就好了嘛,然后直接改了代码,这就没有额外的内存消耗了。
    1、直接对原数据进行平方并进行替换
    2、对容器进行排序,返回就可以了

    class Solution {
    public:
        vector<int> sortedSquares(vector<int>& nums) {
            for (int i = 0; i < nums.size(); i++) {
                nums[i] = pow(nums[i],2);
            }
            sort(nums.begin(), nums.end());
            return nums;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    LeetCode 209.长度最小的子数组

    题目链接:209.长度最小的子数组

    解法一:暴力(不考虑超时)

    以下代码为暴力方法,for循环里面嵌套一个for循环进行搜索,却只通过了17个测试用例,后面一直超时错误,也没想到其他方法,就看了别人的方法,在后面。

    class Solution {
    public:
        int minSubArrayLen(int target, vector<int>& nums) {
            vector<int> v;
            int x,y;
            int sum2 = 0;
            for (int i = 0; i < nums.size(); i++) {
                if (nums[i] >= target) {
                    v.push_back(1);
                }
            }
            for (int i = 0; i < nums.size()-1; i++) {
                int sum = nums[i];
                for (int j = i+1; j < nums.size(); j++) {
                    sum += nums[j];
                    if (sum >= target) {
                        x = i;
                        y = j;
                        int sub = y-x+1;
                        v.push_back(sub);
                        break;
                    }
                }
            }
            if (v.empty()) {
                v.push_back(0);
            }
            sort(v.begin(),v.end());
            return v[0];
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述
    在这里插入图片描述

    官方的暴力更简便点,但都一个思路,我写的冗余点,但官方暴力还是无法AC。
    class Solution {
    public:
        int minSubArrayLen(int target, vector<int>& nums) {
            int n = nums.size();
            if ( n == 0) {
                return 0;
            }
            int ans = INT_MAX;
            for (int i = 0; i < n; i++) {
                int sum = 0;
                for (int j = i; j < n; j++) {
                    sum += nums[j];
                    if (sum >= target) {
                        ans = min(ans, j-i+1);
                        break;
                    }
                }
    
            }
            return ans == INT_MAX ? 0 : ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    解法二:滑动窗口

    思路:不断的调节子序列的起始位置和终止位置,假如先设置起始位置,其思想和暴力没什么区别,所以得先设置终止位置。
    1、设置j为终止位置指针,不断往后遍历,直到大于等于target的位置
    2、滑动起始位置,往后移动一位(这时候窗口内的和会减去之前起始的一位,由于减去的这个数的值不知道大小,所以可能减去还是会大于等于target,所以要用while进行判断),然后不断进行更新判断就行
    在这里插入图片描述

    class Solution {
    public:
        int minSubArrayLen(int target, vector<int>& nums) {
            int ans = INT32_MAX;
            int sum = 0;
            int i = 0;
            for(int j = 0; j < nums.size(); j++){
                sum += nums[j];
                while(sum >= target) {
                    ans = min(ans, j-i+1);
                    sum = sum - nums[i];
                    i++;
                }
            }
            return ans == INT_MAX ? 0 : ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    LeetCode 59.螺旋矩阵II

    题目链接:59.螺旋矩阵II

    思路:按照螺旋的规律,对矩阵进行填充,先填外圈,再填内圈,直到最里面
    根据下图可有效得到:
    1、先判断要填几圈,也就是最外层的for循环要走多少次。
    2、每一圈填充时,每次都走该圈的边长减1
    即,走4X4最外圈时,每次都走3步,走里圈2X2时,每次都走1步。
    走5X5最外圈时,每次都走4步,走里圈3X3时,每次都走2步,最后还剩下一个。
    3、由于每圈的走法都是一样的,都分为四次,所以只需要写一圈的的走法就可以
    设定四个指针变量,方便到内圈的时候也适用。
    第一次走,横坐标不变(为heng),纵坐标从zong走到zong_wei - 1;
    第二次走,纵坐标不变(为zong_wei),横坐标从heng走到heng_wei - 1;
    第三次走,横坐标不变(为heng_wei),纵坐标从zong_wei走到zong + 1;
    第四次走,纵坐标不变(为zong),横坐标从heng_wei走到heng + 1;
    执行完,对zong++;zong_wei–;heng++;heng_wei–;即可进入下一圈。

    注意:特殊奇数螺旋矩阵的时候,最里面一圈只填入一个,当zong和zong_wei都指向最中间时(heng和heng_wei也指向最中间)插入完,会再对它们进行++和–操作,这时候会报错,所以这时候需要判断以下。

    4、走完输出即可。

    4X4的螺旋矩阵

    在这里插入图片描述

    class Solution {
    public:
        vector<vector<int>> generateMatrix(int n) {
            vector<vector<int>> v(n, vector<int>(n));
            int heng = 0;
            int heng_wei = n-1; 
            int zong = 0;
            int zong_wei = n-1;
            int k = n/2;
            int m = 1;
            if (n == 1){
                v[0][0] = 1;
            }
            else{
                for (int j = 0; j <= k-1; j++) {
                    for (int i = zong; i <= zong_wei-1; i++) {
                        v[heng][i] = m;
                        m ++;
                    }
                    for (int i = heng; i <= heng_wei-1; i++) {
                        v[i][zong_wei] = m;
                        m ++;
                    }
                    for (int i = zong_wei; i >= zong + 1; i--) {
                        v[heng_wei][i] = m;
                        m ++;
                    }
                    for (int i = heng_wei; i >= heng + 1; i--) {
                        v[i][zong] = m;
                        m ++;
                    }
                    heng ++;
                    heng_wei --;
                    zong ++;
                    zong_wei --;
                    if (heng == heng_wei){
                    v[heng][heng] = m;
                    }
                }
            }
            return v;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    在这里插入图片描述

  • 相关阅读:
    在线聊天系统,即时通讯系统
    TikTok剪辑系统升级:照片模式增加文案字数,达人合作平台更新
    CCL 2023 电信网络诈骗案件分类评测-第一名方案
    Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化
    git下载及基础
    element树形控件编辑节点组装节点
    C语言进阶——动态内存管理
    就瞎写=感想
    # 从浅入深 学习 SpringCloud 微服务架构(三)注册中心 Eureka(1)
    小优化记录
  • 原文地址:https://blog.csdn.net/weixin_41603934/article/details/127898651