Day2: 双指针977 滑动窗口209 循环不变量原则59


题目977. 有序数组的平方 - 力扣(LeetCode)

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
       int left=0;
       int right=nums.size()-1;
       vector<int> result(nums.size(),0);
       int i=right;
       while(left<=right)
       {
        if(nums[left]*nums[left]>nums[right]*nums[right])
        {
            result[i--]=nums[left]*nums[left];
            left++;
        }else
        {
            result[i--]=nums[right]*nums[right];
            right--;
        }
       }
       return result;

    }
};

题目209. 长度最小的子数组 - 力扣(LeetCode)

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int left=0;//滑动窗口起始位置
        int right=0;//滑动窗口结束位置
        int arrylen=0;//滑动窗口大小
        int sum=0;//目前滑动窗口总和
        int result=INT32_MAX;//返回值
        while(right<nums.size())
        {
            //滑动窗口结束位置的移动
            sum+=nums[right++];
            while(sum>=target)//如果sum大于target,先记录长度,再移动滑动窗口起始位置,一直检查到不满足这个条件,再移动滑动窗口结束位置
            {
                arrylen=right-left;//注意长度计算
                result=result>arrylen?arrylen:result;//长度最小的数组,要和上次记录满足条件的数字比较,最小的那个就是需要的
                sum-=nums[left++];
            }
        }
        //判断是不是没有符合条件的子数组,如果没有返回0
        return (result==INT32_MAX)?0:result;
    }
};

题目59. 螺旋矩阵 II - 力扣(LeetCode)

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int len = n - 1; // 每次填数字的单边长度
        vector<int> vec(n, 0);
        vector<vector<int>> res;
        int j = 0;
        while (j++ < n) {
            res.push_back(vec);
        }
        // 开始填充
        int x = 0;
        int y = 0;
        int i = 1;        // i要填充的数组
        int loop = n / 2; // 旋转填充的次数,n为基数中间单独处理
        while (loop--) {
            // 从左到右
            for (x; x < len; x++) {
                res[y][x] = i++;
            }
            // 从上到下
            for (y; y < len; y++) {
                res[y][x] = i++;
            }
            // 从右到左
            for (x; x > n - len - 1; x--) {
                res[y][x] = i++;
            }
            // 从下到上
            for (y; y > n - len - 1; y--) {
                res[y][x] = i++;
            }
            x++;
            y++;
            len--;
        }
        // 注意:如果n为奇数,需要给最中间单独赋值
        int mid = n / 2;
        if (n % 2 == 1) {
            res[mid][mid] = i;
        }

        return res;
    }
};

最后

学习了滑动窗口,这个要再多练习一下,不是很熟练,,需要熟练掌握双指针,还有对左闭右开区间要熟悉,螺旋矩阵可以多练练,,加油!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vpurple__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值