代码随想录算法训练营42期day02

977.有序数组的平方

思路一:暴力解法

先遍历数组全部平方,再进行排序

时间复杂度O(nlgn)

代码:

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    for (let i=0; i < nums.length; i++) {
        nums[i] *= nums[i];
    }
    return nums.sort((a, b) => a-b);
};
思路二:双指针

将两个指针i和j分别指向数组两端, 指针k指向新数组的末端

如果 nums[i] *nums[i] > nums[j] * nums[j] ,将 result[k--] = nums[i] *nums[i] , 后将 i++

如果 nums[i] *nums[i] <= nums[j] * nums[j] ,将 result[k--] = nums[j] *nums[j] , 后将 j--

循环至两个指针重合

代码:

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    let result = [];
    let i = 0, k = nums.length - 1, j = nums.length - 1;
    while (i <= j) {
        let left = nums[i] * nums[i],
            right = nums[j] * nums[j];
        if (left > right) {
            result[k] = left;
            k--;
            i++;
        } else {
            result[k] = right;
            k--;
            j--;
        }
    }
    return result;
};

 209.长度最小的子数组

思路一:暴力解法

双循环

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    let sum = 0, subLength = 0;
    let result = Infinity;
    for (let i=0; i < nums.length; i++) {
        sum = 0;
        for (let j=i; j < nums.length; j++) {
            sum += nums[j];
            if (sum >= target) {
                subLength = j-i+1;
                result = result < subLength ? result : subLength;
                break;
            }
        }
    }
    return result === Infinity ? 0 : result;
};

 思路二:滑动窗口

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    let start = 0, end = 0, sum = 0, len = 0;
    let result = Infinity;
    while (end < nums.length) {
        sum += nums[end];
        while (sum >= target) {
            len = end - start + 1;
            result = result < len ? result : len;
            sum -= nums[start];
            start++;
        }
        end++;
    }
    return result === Infinity ? 0 : result;
};

59.螺旋矩阵II

思路:坚持循环不变量原则

/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    let startX = 0, startY = 0; // 起始位置
    let mid = Math.floor(n/2); // 中间位置
    let loop = Math.floor(n/2); // 总共旋转圈数
    let offset = 1; // 当前旋转圈数
    let count = 1; // 更新填充数字
    let res = new Array(n).fill(0).map(() => new Array(n).fill(0));
    
    while (loop--) {
        let row = startX, col = startY;
        for (; col < n-offset; col++) {
            res[row][col] = count++;
        }
        for (; row < n-offset; row++) {
            res[row][col] = count++;
        }
        for (; col > startY; col--) {
            res[row][col] = count++;
        }
        for (; row > startX; row--) {
            res[row][col] = count++;
        }
        // 更新起始位置
        startX++;
        startY++;
        // 更新offset
        offset++;
    }
    // 如果n为奇数的话,需要单独给矩阵最中间的值赋值
    if (n % 2 === 1) {
        res[mid][mid] = count;
    }
    return res;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值