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

文章介绍了在代码随想录算法训练营中涉及的三个题目:有序数组的平方、长度最小的子数组使用滑动窗口方法求解,以及螺旋矩阵II的生成。作者提供了对应的C++代码实现和思路分析。
摘要由CSDN通过智能技术生成

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

977.有序数组的平方-Easy

状态:已完成

// 977.有序数组的平方
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int loc = 0;
        while(loc < nums.size()){
            nums[loc] = pow(nums[loc], 2);
            loc++;
        }
        sort(nums.begin(), nums.end());
        return nums;
    }
};

209.长度最小的子数组-Medium

状态:已完成

代码随想录题解:

// 209.长度最小的子数组
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0;
        int i = 0;
        int subLength = 0;
        for(int j = 0; j < nums.size(); j++){//右指针开始滑动
            sum += nums[j];
            while(sum >= s){
                subLength = (j - i + 1);
                result = result < subLength ? result : subLength;// 确保result最小
                sum -= nums[i++];//左指针开始滑动
            }
        }
        return result == INT32_MAX ? 0 : result;
    }
};

labuladong有一个滑动窗口模板,结构如下:

/* 滑动窗口算法框架 */
void slidingWindow(string s) {
    // 用合适的数据结构记录窗口中的数据
    unordered_map<char, int> window;
    
    int left = 0, right = 0;
    while (right < s.size()) {
        // c 是将移入窗口的字符
        char c = s[right];
        window.add(c)
        // 增大窗口
        right++;
        // 进行窗口内数据的一系列更新
        ...

        /*** debug 输出的位置 ***/
        // 注意在最终的解法代码中不要 print
        // 因为 IO 操作很耗时,可能导致超时
        printf("window: [%d, %d)\n", left, right);
        /********************/
        
        // 判断左侧窗口是否要收缩
        while (left < right && window needs shrink) {
            // d 是将移出窗口的字符
            char d = s[left];
            window.remove(d)
            // 缩小窗口
            left++;
            // 进行窗口内数据的一系列更新
            ...
        }
    }
}

尝试使用滑动窗口模板,自己做一版如下:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int left = 0, right = 0;
        int sum = 0;
        int subLength = 0;
        int result = INT32_MAX;
        while(right < nums.size()){
            sum += nums[right];
            right++;// 与for循环不同,for循环每次最后更新right,while循环在此时已经将right+1
            while(left <= right && sum >= target){
                subLength = (right - left);// 在此处不需要再-1,因为right已经往后走了一位
                result = result < subLength ? result : subLength;// 满足条件的最小数组长度
                sum = sum - nums[left];
                left++;
            }
        }
        return result == INT32_MAX ? 0 : result;
    }
};

59.螺旋矩阵 II-Medium

状态:已完成

// 59.螺旋矩阵 II
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
        int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
        int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
        int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
        int count = 1; // 用来给矩阵中每一个空格赋值
        int offset = 1; // 需要控制每一条边遍历的长度,每次循环右边界收缩一位
        int i, j;
        while(loop--){
            i = startx;
            j = starty;
            // 下面开始的四个for就是模拟转了一圈
            // 模拟填充上行从左到右(左闭右开)
            for(j = starty; j < n - offset; j++){
                res[startx][j] = count++;
            }
            for(i = startx; i < n - offset; i++){
                res[i][j] = count++;
            }
            for(; j > starty; j--){
                res[i][j] = count++;
            }
            for(; i > startx; i--){
                res[i][j] = count++;
            }
            startx++;
            starty++;
            offset++;
        }
        if(n % 2 != 0){
            res[mid][mid] = n * n;
        }
        return res;

    }
};
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值