栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

螺旋矩阵相关题目

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

螺旋矩阵相关题目

螺旋矩阵

模拟顺时针画矩阵的过程:

填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上

本文推荐两道螺旋矩阵的题,均来自LeetCode,使用Java编写。

螺旋矩阵

给你一个 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]

提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100

class Solution {
    public List spiralOrder(int[][] matrix) {
        List list = new ArrayList();
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return list;
        }
        int rows = matrix.length, colums = matrix[0].length;
        int top = 0, bottom = rows - 1, left = 0, right = colums - 1;
        while (top <= bottom && left <= right) {
            //上界
            for (int i = left; i <= right; i++) {
                list.add(matrix[top][i]);
            }
            //右界
            for (int i = top + 1; i <= bottom; i++) {
                list.add(matrix[i][right]);
            }
            if (top < bottom && left < right) {
                //下界
                for (int i = right - 1; i >= left + 1; i--) {
                    list.add(matrix[bottom][i]);
                }
                //左界
                for (int i = bottom; i >= top + 1; i--) {
                    list.add(matrix[i][left]);
                }
            }
            top++;
            bottom--;
            left++;
            right--;
        }
        return list;
    }
}

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

示例 1:

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

输入:n = 1
输出:[[1]]

提示:
1 <= n <= 20

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] result = new int[n][n];
        int loop = n / 2;
        int startX = 0, startY = 0;
        int offset = 1;
        //如果n为奇数则有中间元素
        int mid = n / 2;
        int count = 1;
        while (loop > 0) {
            int i = startX, j = startY;
            //上侧从左到右
            for (; j < startY + n - offset; j++) {
                result[startX][j] = count++;
            }
            //右侧从上到下
            for (; i < startX + n - offset; i++) {
                result[i][j] = count++;
            }
            //下侧从右到左
            for (; j > startY; j--) {
                result[i][j] = count++;
            }
            //左侧从下到上
            for (; i > startX; i--) {
                result[i][j] = count++;
            }
            startX++;
            startY++;
            offset += 2;
            loop--;
        }
        //如果n为奇数
        if (n % 2 == 1) {
            result[mid][mid] = count;
        }
        return result;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/870028.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号