【第二天| 977.有序数组的平方、209.长度最小的子数组、 59.螺旋矩阵】

本文介绍了两种数组操作的算法:一种是给定一个整数数组,返回其所有元素平方后的有序数组;另一种是在给定数组中找到和大于等于目标值的最小子数组长度。这两种方法都采用了双指针技术。此外,还讨论了生成螺旋矩阵的算法,通过循环填充实现矩阵的螺旋排列。

977. 有序数组的平方

[思路]: 首尾双指针。首尾元素比较绝对值大小,把平方大的放入res[k]。

在这里插入图片描述

 vector<int> sortedSquares(vector<int>& nums) {
        vector<int> res (nums.size(),0);
        int k = nums.size()-1;
        for(int i=0, j=nums.size()-1; i<=j;)
        {
            if(abs(nums[i]) > abs(nums[j]))
            {
                res[k--] = nums[i]*nums[i];
                i++;
            }
            else{
                res[k--] = nums[j]*nums[j];
                j--;
            }
        }
        return res;
    }

209. 长度最小的子数组

[思路:] 快慢双指针,模拟滑动窗口。

在这里插入图片描述

int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0; // i-j窗口内数值之和
        int i = 0; // 窗口左边界
        int subLength = 0; // 窗口长度
        for (int j = 0; j < nums.size(); j++) {//移动有边界,直到窗口内总和大于等于target
            sum += nums[j];
            // 注意这里使用while,每次更新 i(起始位置),并不断比较子数组是否符合条件。当不符合条件时才需要移动右边加j以扩大窗口
            while (sum >= target) {
                subLength = (j - i + 1); // 取子数组的长度
                result = result < subLength ? result : subLength;//更新result
                i++;//移动左边界
                sum -= nums[i]; //移除窗口外的元素
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }

59. 螺旋矩阵Ⅱ

按如下顺序填充一圈。圈数round=n/2. 例外每一圈开始的位置用start_istart_j表示。每填充完一圈,下一圈的起始位置等于start_i++, start_j++.
注意n为奇数时,这样的循环不会填充后一层的,即res[n/2][n/2],因为它只有一个元素。所以最后额外添加就好。

在这里插入图片描述

vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector(n,0));
        int round = n/2;
        int start_i =0, start_j=0;
        int num=1;
        while(start_i<round)
        {
            int j =start_j, i=start_i;
            for(; j<n-1-start_i; j++)
            {
                res[i][j] = num++;
            }
            for(; i<n-1-start_j; i++)
            {
                res[i][j] = num++;
            }
            for(;j>start_j; j--)
            {
                res[i][j] = num++;
            }
            for(;i>start_i; i--)
            {
                res[i][j] = num++;
            }
            start_i++;
            start_j++;
        }
        if(n%2==1) res[n/2][n/2]=num;
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值