【前端er每日算法】数组3道题

89 阅读1分钟

题目1、977. 有序数组的平方

思路

双指针法,1种是从两头开始,相当于从大到小插入元素到数组前面,每次比较大小,插入大的,并且移动指针,直到2者相遇。

var sortedSquares = function(nums) {
    let len = nums.length;
    let i = 0;
    let j = len - 1;
    let res = []
    let count = 0;
    while (i <= j) {
        count++;
        let squareI = nums[i] * nums[i];
        let squareJ = nums[j] * nums[j];
        if (squareI < squareJ) {
            res[len - count] = squareJ;
            j--;
        } else {
            res[len - count] = squareI;
            // res.unshift(squareI)
            i++
        }
    }
    return res;
};

双指针法,方法2,找到第一个大于0的元素j,i是前一个元素,向两边逐渐扩散,直到全部出界。

var sortedSquares = function(nums) {
    let len = nums.length;
    let j = 0;
    let res = []
    while(nums[j] < 0) {
        j++;
    }
    let i = j - 1;
    while(i >= 0 && j < len) {
        let squareI = nums[i] * nums[i];
        let squareJ = nums[j] * nums[j];
        if (squareI < squareJ) {
            res.push(squareI);
            i--;
        } else {
            res.push(squareJ);
            j++;
        }
    }
    while (i >= 0) {
        res.push(nums[i] * nums[i])
        i--;
    }
    while (j < len) {
        res.push(nums[j] * nums[j])
        j++
    }
    return res;
};

题目二 209. 长度最小的子数组

思路

滑动窗口的思路,循环结束位置,不断累加,直到结果超过target,这时候开始增大起始值,直到不满足条件,同时更新满足条件的子序列的长度,取最小长度。

var minSubArrayLen = function(target, nums) {
    let sum = 0;
    let result = Number.MAX_SAFE_INTEGER;
    let i = 0;
    let total = 0;
    for (let j = 0; j < nums.length; j++) {
        sum += nums[j];
        total += nums[j];
        while (sum >= target) {
            const length = j - i + 1;
            result = Math.min(result, length);
            sum -= nums[i++];
        }
    }
    if (total < target) {
        return 0;
    }
    return result;
};

题目三 59. 螺旋矩阵 II

思路

好多个变量, startX,startY代表每一圈的起始点,offset代表每一圈的偏移量,loop代表循环几圈,如果是奇数,则最中间的数字需要最后进行填充。

循环:每次保证左闭右开

  1. 先填充上面一行
  2. 填充右侧列
  3. 填充下面一行
  4. 填充左侧列
var generateMatrix = function(n) {
    let startX = 0;
    let startY = 0;
    let offset = 1;
    let result = new Array(n).fill(0).map(item => new Array(n).fill(0));
    let count = 1;
    let loop = Math.floor(n / 2);
    while (loop-- > 0) {
        let row = startX;
        let col = startY;
        for (; col < n - offset; col++) {
            result[row][col] = count++;
        }
        for (; row < n - offset; row++) {
            result[row][col] = count++;
        }
        for (; col > startY; col--) {
            result[row][col] = count++;
        }
        for (; row > startX; row--) {
            result[row][col] = count++;
        }
        startX++;
        startY++;
        offset++;
    }
    if (n % 2 === 1) {
        let center = Math.floor(n / 2);
        result[center][center] = count;
    }
    return result;
};