代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组

49 阅读1分钟

977.有序数组的平方

题目链接

思路是双指针,因为是非递减数组,所以最大值在数组两端,所以两个指针从数组两边往中间遍历。同时因为能确定最大值的位置但是不能确定最小值的位置,所以新的数组是倒序遍历。

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var sortedSquares = function(nums) {
    let left = 0;
    let right = nums.length - 1;

    let res = new Array(nums.length).fill(0);

    let k = right;
    while(left <= right) {
        let i = nums[left] * nums[left];
        let j = nums[right] * nums[right];

        if (i < j) {
            res[k--] = j;
            right--;
        } else {
            res[k--] = i;
            left++;
        }
    }

    return res;
};

209. 长度最小的子数组

209题目链接

/**
 * @param {number} target
 * @param {number[]} nums
 * @return {number}
 */
var minSubArrayLen = function(target, nums) {
    let result = Infinity;

    let sum = 0;
    let j = 0;
    for (let i = 0; i < nums.length; i++) {
        sum += nums[i];

        while(sum >= target) {
            const currentLen = i - j + 1;
            result = currentLen < result ? currentLen : result;
            
            // 重点在于移动窗口的起始端点
            sum -= nums[j];
            j++;
        }
    }

    return result === Infinity ? 0 : result;
};