[力扣题解]数组部分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变量控制边界.

浙公网安备 33010602011771号