第二天 :977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

本文解析了三道LeetCode上的经典算法题:有序数组的平方、长度最小的子数组及螺旋矩阵II。针对每道题都提供了详细的思路分析及C++代码实现。

977.有序数组的平方 

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

数组是非递减排序的,虽然存在负数平方后值更大的情况,但是可以确定最大值一定在两端,那么只要从两端向中间靠拢就可以从大到小排序了,可以使用双指针分别指向数组开始和末尾,比较平方较大的值插入新数组的末尾。

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

209.长度最小的子数组 

题目:给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 

通过滑动窗口,不断改变序列的起始位置,得到满足条件的结果。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX;
        int sum = 0; 
        int i = 0; 
        int j=0;
        int subLength = 0; 
        while(j<nums.size()){
            sum +=nums[j];
            while(sum>=target){
                subLength = (j-i+1);//子串长度
                result = result <subLength ? result : subLength;
                sum -= nums[i++];//起点向后移动
            }
            j++;
        }
        return result == INT32_MAX ? 0 : result;
    }
};

59.螺旋矩阵II 

题目:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

写的时候注意边界条件的判断,保持同一种边界判定,这样避免出现重复,或者缺失。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0));
        int up = 0, down = n - 1, left = 0, right = n - 1;
        int num = 1;
        while (num<=n*n) {
            for (int i = left; i <= right; ++i) res[up][i] = num++;  
            ++up;
            for (int i = up; i <= down; ++i) res[i][right] = num++;
            --right;
            for (int i = right; i >= left; --i) res[down][i] = num++;
            --down;
            for (int i = down; i >= up; --i) res[i][left] = num++;
            ++left;
        }
        return res;
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值