自学内容网 自学内容网

leetcode59-螺旋矩阵

leetcode 59
在这里插入图片描述

思路

对于边界条件的处理使用左闭右开,也就是说每次转圈的时候包含第一个节点,不包含最后一个节点,最后一个节点用于下次转圈的起始点
另外要考虑一下总共需要转几圈,因为每次转圈都要经过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)!