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;
};