代码随想录算法训练营Day2 | 977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

977.有序数组的平方

题目链接:977.有序数组的平方

暴力解法

思路

先将数组计算平方,再排序。时间复杂度是O(n+nlogn),也就是O(nlogn)。

双指针解法

思路

数组是有序的,平方之后最大值一定在数组的两端,可以社两个指针从两侧进行移动,将平方值更大的数倒着填进数组中。时间复杂度为O(n)。

代码

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    let start=0, end=nums.length-1, res=[], i=nums.length-1;
    while(i >= 0) {
        // js中可以用Math.abs()求平方
        if(nums[start]*nums[start] > nums[end]*nums[end]) {
            res[i--] = nums[start]*nums[start];
            start++;
        } else {
            res[i--] = nums[end]*nums[end];
            end--;
        }
    }
    return res;
};

209.长度最小的子数组

题目链接:209.长度最小的子数组

暴力解法

思路

设置一个数组,保存可能存在的长度。
循环遍历整个数组,每遍历到一个数就开始求和n,如果n≥item,就将n填入数组中,并跳到下一个数。
返回长度数组中最小的值。

滑动窗口解法

思路

滑动窗口,就是不断调节子序列的起始位置和终点位置。
终止位置就是遍历的指针,当sum>=s,比较长度是否为最短长度,如果不是,将窗口收缩(向后移动慢指针),直到遍历完整个数组。

代码

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    let slow=0, fast=0, count=0, min=nums.length, flag=0;
    while(fast <= nums.length) {
        count += nums[fast++];
        // 收缩滑动窗口
        while(count >= target) {
            flag=1;
            count-=nums[slow++];
            min = min < fast-slow+1 ? min : fast-slow+1;
        }
    }
    return flag ? min : 0;
};

59.螺旋矩阵II

题目链接:59.螺旋矩阵II

思路

找到矩阵的变化规律,重点是划分好区间,所有的区间都要一致。

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    let num=1, center=Math.floor(n/2);
    let res = new Array(n).fill(0).map(()=>new Array(n).fill(0));
    for(let i=0;i<center;i++) {
        for(let j=i; j<n-1-i; j++) {
            res[i][j] = num++;
        }
        for(let j=i ;j<n-1-i; j++) {
            res[j][n-1-i] = num++;
        }
        for(let j=n-1-i ;j > i; j--) {
            res[n-1-i][j] = num++;
        }
        for(let j=n-1-i ;j > i; j--) {
            res[j][i] = num++;
        }
    }
    if(n%2 === 1) {
        res[center][center]=n*n;
    }
    return res;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值