0
点赞
收藏
分享

微信扫一扫

七、leetcode - 矩阵(JS)

覃榜言 2022-04-18 阅读 68

74. 搜索二维矩阵

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。

每行的第一个整数大于前一行的最后一个整数。

输入: matrix = [
                    [1, 3, 5, 7 ],
                    [10,11,16,20],
                    [23,30,34,60]
                ], target = 3
输出: true
搜索过程,从左下角23开始,23大于3,
向上缩小为10,10大于3,
向上缩小为1,1小于3,
向右扩大为3,3等于3,结束查找

23 
10 
1 
3
/**
 * @param {number[][]} matrix
 * @param {number} target
 * @return {boolean}
 */
var searchMatrix = function(matrix, target) {
    let x = matrix.length - 1, y = 0;
    while(x >= 0 && y < matrix[0].length) {
        if(matrix[x][y] === target) {
            return true;
        } else if(matrix[x][y] > target) {
            x--;
        } else {
            y++;
        }
    }
    return false;
};

59. 螺旋矩阵 II

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

输入: n = 3
输出: [
        [1,2,3],
        [8,9,4],
        [7,6,5]
       ]
startX=0 startY=0 
[ [ 1, 2, null ], [ null, null, null ], [ null, null, null ] ] 1 
[ [ 1, 2, 3 ],    [ null, null, 4 ],    [ null, null, null ] ] 1 
[ [ 1, 2, 3 ],    [ null, null, 4 ],    [ null, 6, 5 ] ]       1 
[ [ 1, 2, 3 ],    [ 8, null, 4 ],       [ 7, 6, 5 ] ]          1 
=======
输入: n = 4
输出: [
        [1,2,3,4],
        [12,13,14,5],
        [11,16,15,6],
        [10,9,8,7]
      ]
startX=0 startY=0 
[ [ 1, 2, 3, null ], [ null, null, null, null ], [ null, null, null, null ], [ null, null, null, null ] ] 1 
[ [ 1, 2, 3, 4 ], [ null, null, null, 5 ], [ null, null, null, 6 ], [ null, null, null, null ] ] 1 
[ [ 1, 2, 3, 4 ], [ null, null, null, 5 ], [ null, null, null, 6 ], [ null, 9, 8, 7 ] ] 1 
[ [ 1, 2, 3, 4 ], [ 12, null, null, 5 ], [ 11, null, null, 6 ], [ 10, 9, 8, 7 ] ] 1 
======= 
startX=1 startY=1 
[ [ 1, 2, 3, 4 ], [ 12, 13, null, 5 ], [ 11, null, null, 6 ], [ 10, 9, 8, 7 ] ] 2 
[ [ 1, 2, 3, 4 ], [ 12, 13, 14, 5 ], [ 11, null, null, 6 ], [ 10, 9, 8, 7 ] ] 2 
[ [ 1, 2, 3, 4 ], [ 12, 13, 14, 5 ], [ 11, null, 15, 6 ], [ 10, 9, 8, 7 ] ] 2 
[ [ 1, 2, 3, 4 ], [ 12, 13, 14, 5 ], [ 11, 16, 15, 6 ], [ 10, 9, 8, 7 ] ] 2 
=======
/**
 * @param {number} n
 * @return {number[][]}
 */
var generateMatrix = function(n) {
    // let res = Array.from({length: n}).map(() => new Array(n));
    let res = new Array(n).fill().map(() => new Array(n).fill(null));
    let loop = n >> 1, i = 0; //循环次数
    let count = 1;
    let startX = startY = 0; // 起始位置 
    while(++i <= loop) {
        console.info('startX='+startX+' startY='+startY);
        // 定义行列
        let row = startX, column = startY;
        // [ startY, n - i) 填充1、2
        while(column < n - i) res[row][column++] = count++;
        console.info(res);
        console.info(i);
        // [ startX, n - i) 填充3、4
        while(row < n - i) res[row++][column] = count++;
        console.info(res);
        console.info(i);
        // [n - i ,  startY) 填充5、6
        while(column > startY) res[row][column--] = count++; 
        console.info(res);
        console.info(i);
        // [n - i ,  startX) 填充7、8
        while(row > startX) res[row--][column] = count++;
        console.info(res);
        console.info(i);
        console.info('=======');
        startX = ++startY;
    }
    if(n & 1) {// 如果为奇数,额外填充一次中心
        res[startX][startY] = count;
    }
    return res;
};

按 上 右 下 左,一层层向内,遍历矩阵填格子

[ [ 1, 2, 3 ], [ null, null, null ], [ null, null, null ] ] 4 
[ [ 1, 2, 3 ], [ null, null, 4 ], [ null, null, 5 ] ] 6 
[ [ 1, 2, 3 ], [ null, null, 4 ], [ 7, 6, 5 ] ] 8 
[ [ 1, 2, 3 ], [ 8, null, 4 ], [ 7, 6, 5 ] ] 9 
======= 
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 10 
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 10 
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 10 
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 10 
=======
[ [ 1, 2, 3, 4 ], [ null, null, null, null ], [ null, null, null, null ], [ null, null, null, null ] ] 5 
[ [ 1, 2, 3, 4 ], [ null, null, null, 5 ], [ null, null, null, 6 ], [ null, null, null, 7 ] ] 8 
[ [ 1, 2, 3, 4 ], [ null, null, null, 5 ], [ null, null, null, 6 ], [ 10, 9, 8, 7 ] ] 11 
[ [ 1, 2, 3, 4 ], [ 12, null, null, 5 ], [ 11, null, null, 6 ], [ 10, 9, 8, 7 ] ] 13 
======= 
[ [ 1, 2, 3, 4 ], [ 12, 13, 14, 5 ], [ 11, null, null, 6 ], [ 10, 9, 8, 7 ] ] 15 
[ [ 1, 2, 3, 4 ], [ 12, 13, 14, 5 ], [ 11, null, 15, 6 ], [ 10, 9, 8, 7 ] ] 16 
[ [ 1, 2, 3, 4 ], [ 12, 13, 14, 5 ], [ 11, 16, 15, 6 ], [ 10, 9, 8, 7 ] ] 17 
[ [ 1, 2, 3, 4 ], [ 12, 13, 14, 5 ], [ 11, 16, 15, 6 ], [ 10, 9, 8, 7 ] ] 17 
=======
var generateMatrix = function (n) {
    let matrix = new Array(n).fill().map(() => new Array(n).fill(null));
    let num = 1;
    let left = 0, right = n - 1, top = 0, bottom = n - 1;
    while (num <= n * n) {
        // 从左到右
        for (let i = left; i <= right; i++) matrix[top][i] = num++; 
        console.info(matrix);
        console.info(num);
        top++;
        // 从上到下
        for (let i = top; i <= bottom; i++) matrix[i][right] = num++;
        console.info(matrix);
        console.info(num);
        right--;
        // 从右到左
        for (let i = right; i >= left; i--) matrix[bottom][i] = num++;
        console.info(matrix);
        console.info(num);
        bottom--;
        // 从下到上
        for (let i = bottom; i >= top; i--) matrix[i][left] = num++;
        console.info(matrix);
        console.info(num);
        left++;
        console.info('=======');
    }
    return matrix;
};
举报

相关推荐

0 条评论