leetcode59-螺旋矩阵
思路
对于边界条件的处理使用左闭右开,也就是说每次转圈的时候包含第一个节点,不包含最后一个节点,最后一个节点用于下次转圈的起始点
另外要考虑一下总共需要转几圈,因为每次转圈都要经过2行/2列,所以需要的圈数是:n / 2,但是需要考虑一下当n是奇数时,中间还有个点需要赋予值,所以我们可以在起始先给中间节点赋值
每次转圈的时候都是顺时针的,所以依次进行遍历即可,遍历完一圈以后,进行下一圈遍历因为圈缩小了,所以起始位置的start++,结束位置的偏移量也要++
实现
/**
* @param {number} n
* @return {number[][]}
*/
var generateMatrix = function (n) {
// 初始化数组,存储最终数据
let nums = new Array(n).fill(0).map(item => new Array(n).fill(0));
let loop = Math.floor(n / 2); // 总圈数
let start = 0; // 起始位置
/**
偏移位置,由于每一圈都是[left,right),不包含最后一个节点
最后节点作为下一次的起始节点,所以需要有偏移
*/
let offset = 1;
let count = 1; // 计数
// 如果是奇数,那么把最后一个值设置为中心值
if (n % 2) {
nums[loop][loop] = n * n
}
while (loop) {
// 从左向右行占位
for (var i = start; i < n - offset; i++) {
nums[start][i] = count;
count++;
}
// 此时i走到了最后一个节点,进行从上到下的列占位
for (var j = start; j < n - offset; j++) {
nums[j][i] = count;
count++
}
// 此时走到了右下方,开始从右向左占位
while (i > start) {
nums[j][i] = count;
count++;
i--
}
// 此时走到了左下方,开始从下往上
while (j > start) {
nums[j][i] = count;
count++
j--
}
start++;
offset++
loop--;
}
return nums;
};
原文地址:https://blog.csdn.net/weixin_45799371/article/details/145208589
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!