力扣题59螺旋矩阵II
发布日期:2022-03-04 11:48:23 浏览次数:12 分类:技术文章

本文共 3540 字,大约阅读时间需要 11 分钟。

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

示例 1:

输入:n = 3

输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:

输入:n = 1

输出:[[1]]

1.这道题的关键其实就是边界条件的选取,一圈当作一次循环。每一次循环后更新起始点。

class Solution {    public int[][] generateMatrix(int n) {        int[][] nums = new int[n][n];                int loop = n / 2;//循环次数        int startRows = 0;//每一圈的起始行号        int startCols = 0;//每一圈的起始列号        int offset = 1;//偏移值        int num = 1;//当前要填的数        int middle = n / 2;        while (loop > 0) {            int i = startRows;            int j = startCols;            //上侧的从左到右            for (;j < startCols + n - offset;j++) {                nums[i][j] = num;                num++;            }            //右侧的从上到下            for (;i < startRows + n - offset;i++) {                nums[i][j] = num;                num++;            }            //下侧的从右到左            for (;j > startCols;j--) {                nums[i][j] = num;                num++;            }            //左侧的从下到上            for (;i > startRows;i--) {                nums[i][j] = num;                num++;            }            //向内一圈,起始行号、列号加1            startRows += 1;            startCols += 1;            offset += 2;//一圈少2个,所以偏移量+2            loop--;        }        if (n % 2 == 1) {//当是奇数时,最中间的数单独考虑            nums[middle][middle] = num;        }        return nums;    }}

2.利用四个边界来做。

class Solution {    public int[][] generateMatrix(int n) {        int[][] nums = new int[n][n];                int left = 0;        int right = n - 1;        int top = 0;        int down = n - 1;        int count = 1;        while (left <= right && top <= down) {            for (int i = left;i <= right;i++) {                nums[top][i] = count++;            }            top++;            for (int i = top;i <= down;i++) {                nums[i][right] = count++;            }            right--;            for (int i = right;i >= left && top <= down;i--) {                nums[down][i] = count++;            }            down--;            for (int i = down;i >= top && left <= right;i--){                nums[i][left] = count++;            }            left++;        }        return nums;    }}

题源:

力扣题54螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]

输出:[1,2,3,6,9,8,7,4,5]

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]

输出:[1,2,3,4,8,12,11,10,9,5,6,7]

1.以一圈为基准,定义上边界和下边界。

class Solution {    public List
spiralOrder(int[][] matrix) { List
list = new LinkedList<>(); if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return list; } //把一圈分成上侧、右侧、下侧、中侧的顺序 int left = 0;//左边界 int right = matrix[0].length - 1;//右边界 int top = 0;//上边界 int down = matrix.length - 1;//下边界 while (left <= right && top <= down) { //上侧从左往右 for (int i = left;i <= right;i++) { list.add(matrix[top][i]); } top++;//上面遍历完一行,上边界下移 //右侧从上到下 for (int i = top;i <= down;i++) { list.add(matrix[i][right]); } right--;//右侧遍历完一列,右边界左移 //下边界从右往左 for (int i = right;i >= left && top <= down;i--) { list.add(matrix[down][i]); } down--;//下侧遍历完一行,下边界上移 //左侧从下到上 for (int i = down;i >= top && left <= right;i--) { list.add(matrix[i][left]); } left++;//左侧遍历完一列,左边界右移 } return list; }}

题源:

转载地址:https://blog.csdn.net/xxyneymar/article/details/122462843 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:SpringBoot入门(六)数据响应与内容协商
下一篇:Redis入门(四)主从复制

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年03月31日 10时57分55秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章