代码随想录第2天| 滑动窗口,螺旋矩阵
209.长度最小的子数组(中)
题目链接:209.长度最小的子数组
代码随想录
滑动窗口:不断调整子序列的起始终止位置来求结果,for循环表示的是终止位置
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
// 1.窗口内元素:sum>target
// 2. 移动窗口的起始位置i
// 3.移动窗口的终止位置j
int sum = 0;
int i = 0, j = 0;
int count = 0;
int res = INT32_MAX;
for(int j = 0; j < nums.size(); j++){
sum += nums[j];
while(sum >= target){
count = j - i + 1;
res = res < count ? res : count;
sum -= nums[i++];
}
}
return res != INT32_MAX ? res : 0;
}
};
相关题目
904.水果成篮(中)
可以将种类和个数映射到哈希表上,用一个键值对来表示一个种类的水果有多少个。
class Solution {
public:
int totalFruit(vector<int>& fruits) {
int res = 0;
unordered_map<int, int> fruit_map;
int i = 0;
for(int j = 0; j < fruits.size(); j++){
fruit_map[fruits[j]]++;
while(fruit_map.size() > 2){
// 滑动窗口内元素大于2时,i对应元素个数减到0,i随之移动
auto it = fruit_map.find(fruits[i]);
it->second--;
if(it->second == 0)
fruit_map.erase(it);
i++;
}
res = max(res, j - i + 1);
}
return res;
}
};
76. 最小覆盖子串(困难)
59.螺旋矩阵II
题目链接:59.螺旋矩阵II
代码随想录
题目描述:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix
注意边界即可
lass Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n));
int startx = 0, starty = 0; // 每圈起始xy坐标
int loop = n / 2;
int mid = n / 2; // 基数要给最中间的赋值
int offset = 1;// 控制每条边的长度n-offset
int count = 1;
int i, j;
while(loop--){
i = startx;
j = starty;
//左->右 左闭右开
for(; j < n - offset; j++){
res[startx][j] = count++;
}
//右->下
for(; i < n - offset; i++){
res[i][j] = count++;
}
//下->左
for(; j > starty; j--){
res[i][j] = count++;
}
//左->上
for(; i > startx; i--){
res[i][starty] = count++;
}
startx++;
starty++;
offset++;
}
if (n>>1<<1 != n){
res[mid][mid] = n * n;
}
return res;
}
};
相关题目
剑指 Offer 29. 顺时针打印矩阵
这题和上面的区别是,上一题是方阵
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(matrix.size() == 0 || matrix[0].size() == 0)
return res;
int m = matrix.size(); // 行数
int n = matrix[0].size(); //列数
int top = 0, left = 0;
int bottom = m - 1, right = n - 1;
while(left <= right && top <= bottom){
for(int j = left; j <= right; j++){
res.push_back(matrix[top][j]);
}
for(int i = top + 1; i <= bottom; i++){
res.push_back(matrix[i][right]);
}
if(left < right && top < bottom){
for(int j = right-1; j > left; j--){
res.push_back(matrix[bottom][j]);
}
for(int i = bottom; i > top; i--){
res.push_back(matrix[i][left]);
}
}
left++;
right--;
top++;
bottom--;
}
return res;
}
};