【代码随想录第2天】数组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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值