[力扣题解]数组部分2

209.长度最小子数组

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/

算法思路:

最终求满足相应条件的连续数组长度,这里用到的方法是滑动窗口

具体实现是使用一个窗口来包含>=s的元素,并且记录窗口的长度,每次遍历都对窗口进行滑动,如果小于s,则窗口右边界右移,窗口长度增加;当窗口长度大于s,则对窗口左边界进行左移操作,窗口缩小,这时如果仍然满足条件,则与记录的窗口长度进行比较,使用一个三目运算符来进行判断,保留较小的值。

附上可以ac的代码

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;
    }
};

59.螺旋矩阵II

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

算法思路:

题目本身没有比较新奇的思路,就是需要把握代码的能力,对于边界的判断,循环不变量等等

具体实现的话分为四步,也就是对于正方形的四条边的操作:

首先确定循环不变量,也就是每次遍历的规则:这里确定每条边n个元素,都是便利0——n-2元素,也即每条边最后一个元素不进行操作,放到下一条的起始位置进行处理。

同时设次每圈的起始位置点(startx,starty),圈数增加,边界减少,使用offset变量控制边界.

posted @ 2023-11-02 19:26  鱼师傅_L  阅读(9)  评论(0)    收藏  举报