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

本文介绍了如何利用双指针解决有序数组的平方问题,以及运用滑动窗口方法解决寻找长度最小的子数组问题。此外,还讨论了螺旋矩阵生成算法,强调了边界条件和循环控制的细节。这些是提升代码能力和优化时间复杂度的关键。
摘要由CSDN通过智能技术生成

第二天的任务

977.有序数组的平方

代码随想录:有序数组的平方
力扣链接977
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP
这一题主要用到双指针的方法,注意输出result是vector的建立,同时暴力解法,时间复杂度的差异,暴力时间复杂度是 O(n + nlogn),双指针是O(n).

209.长度最小的子数组

代码随想录:209.长度最小的子数组
力扣链接977
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

class Solution {
public:
    int minSubArrayLen(int s, 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,每次更新 i(起始位置),并不断比较子序列是否符合条件
            while (sum >= s) {
                subLength = (j - i + 1); // 取子序列的长度
                result = result < subLength ? result : subLength;
                sum -= nums[i++]; // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

这一题主要是主要是滑动窗口的方法,主要是控制终止位置,需要注意点
1:result的初始值要为最大值INT32_MAX,因为最终的结果可能为最大值,如果设置为比INT32_MAX小的,就不会比较出结果了。
2:result = result < subLength ? result : subLength;这个的意思,先比较result < subLength 吗?如果小于(取真)则取 ? 后面的第一个数result,再赋值给最左侧的result,如果不小于(假)则取 :后面的subLength,再赋值给最左侧的result.
3.这里判断是while (sum >= s),而不是if,因为又可能sum -= nums[i++]之后,sum还是sum >= s,所以要不断进循环,如果是if就直接结束里面的小循环了。
4.暴力解法也要试一试

59.螺旋矩阵II

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

题目链接: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/
本题目就是锻炼代码能力,用在我身上正合适。59题专门针对nn的方阵,对于mn的矩形阵并不适用,我总结出如下的通用格式的版本;

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector<int>(n,0));
        int left = 0;//左边界
        int right = n - 1;//有边界
        int up = 0;//上
        int down = n - 1;//下
        int count = 1;//计数
        while(true) {
            for(int i = left; i <= right; i++) {//向右走到边
                res[up][i] = count++;
            }
            up++;//准备向下,加1
            if(up > down) break;//判断能不能向下
            for(int i = up; i <= down; i++) {//向下走
                res[i][right] = count++;
            }
            right--;
            if (left > right) break;
            for(int i = right; i >= left; i--) {//向左
                res[down][i] = count++;
            }
            down--;
            if(up > down) break;
            for(int i = down; i >= up; i--) {//向上
                res[i][left] = count++;
            }
            left++;
            if(left > right) break;
        }
        return res;     
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值