代码随想录 | Day02 | 数组Part02 | 977.有序数组的平方 | 209. 长度最小的子数组 | 59. 螺旋矩阵

152 阅读1分钟

977.有序数组的平方

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数

思路一、直接用封装后的方法

 function sortArray(nums) {
    nums = nums.map((item)=>item*item)
    nums.sort((a,b)=>a-b)
    return nums
};

思路二、 双指针

var sortedSquares = function(nums) {
    let res = []
    let left = 0
    let right = nums.length-1
    while(left<=right){
        if(Math.abs(nums[left])>Math.abs(nums[right])){
            res.unshift(nums[left])
            left++
        }else{
            res.unshift(nums[right])
            right--
        }
    }

    res = res.map(item=>item*item)
    return res
}

    // 循环结构优化,unshift 操作比较耗时
    let i = right
    while(left<=right){
        if(Math.abs(nums[left])>Math.abs(nums[right])){
            res[i] = nums[left]
            left++
        }else{
            res[i] = nums[right]
            right--
        }
        i--
    }

209. 长度最小的子数组

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

思路一、滑动窗口

function(target, nums) {
    let MinSize = Infinity
    let left = 0
    let right = 0
    let count = 0 
    while(right<nums.length){
        count += nums[right]
        while(count>=target){
            MinSize = Math.min(MinSize,right-left+1)
            count -= nums[left++]
        }
        right++
    }
    return MinSize === Infinity ? 0 : MinSize
};

59. 螺旋矩阵

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

思路一、模拟

function(n) {
        let l = 0, r = n - 1, t = 0, b = n - 1;
        let mat = new Array(n).fill(0).map(() => new Array(n).fill(0));
        let num = 1, tar = n * n;
        while(num <= tar){
            for(let i = l; i <= r; i++){mat[t][i] = num++} // left to right.
            t++;
            for(let i = t; i <= b; i++)mat[i][r] = num++; // top to bottom.
            r--;
            for(let i = r; i >= l; i--) mat[b][i] = num++; // right to left.
            b--;
            for(let i = b; i >= t; i--) mat[i][l] = num++; // bottom to top.
            l++;
        }
        return mat
};
    

总结

数组常见方法:

1. 滑动窗口 :一段序列满足一定条件,求该序列的最?值
2. 双指针 : 节约for循环次数
3. 模拟法 : 模拟螺旋的顺序