【代码随想录训练营】day 2 双指针、滑动窗口、螺旋矩阵

大家好,每天晚上十点我都会在小red书(yzzzzzZ)直播学习哦,相当于一个线上直播间,想要一起学习的同学可以一起哦!

977.有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

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

209.长度最小的子数组

滑动窗口

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int n = nums.size();
        int temp = 0;
        int current_best_ans = 100001;
        int current_start_index = 0;
		// i 是指滑动窗口的右边界
        for (int i=0; i < n; i++){
            temp += nums[i];
            while (temp >= target){
                current_best_ans = current_best_ans > i - current_start_index + 1? i - current_start_index + 1 :current_best_ans;
                temp -= nums[current_start_index];
                current_start_index ++;
            }
        }
        return current_best_ans == 100001 ? 0 : current_best_ans;
    }
};

不要以为for里放一个while就以为是O(n^2)啊,
主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n
也就是O(n)。

59.螺旋矩阵II

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n, vector<int>(n));
        int num = 1;
        int cnt = 0, current_layer = 0;
        for (current_layer = 0; current_layer <= n / 2; current_layer ++){
            for (cnt = 0; cnt < n - 2 * current_layer - 1; cnt ++){
                result[current_layer][cnt + current_layer] = num++;
            }
            for (cnt = 0; cnt < n - 2 * current_layer - 1; cnt ++){
                result[cnt + current_layer][n - current_layer - 1] = num++;
            }
            for (cnt = 0; cnt < n - 2 * current_layer - 1; cnt ++){
                result[n - current_layer - 1][n - 1 - current_layer - cnt] = num++;
            }
            for (cnt = 0; cnt < n - 2 * current_layer - 1; cnt ++){
                result[n - 1 - current_layer - cnt][current_layer] = num++;
            }
        }
        if (n % 2 == 1){
            result[n / 2][n /2] = n * n;
        }
        return result;
    }
};
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值