【LeetCode】解题59:Spiral Matrix II

Problem 59: Spiral Matrix II [Medium]

Given a positive integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

Example:

Input: 3
Output:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]

来源:LeetCode

解题思路

Problem 54 Spiral Matrix类似。
将二维数组由外圈至里圈拆分,每个圈的起点正好位于matrix[i][i],只需要写一个循环一圈的函数side_order(),然后选择不同的起点调用该函数,一共调用 n + 1 2 \frac{n+1}{2} 2n+1次。

具体过程:

  • 创建 n ∗ n n*n nn数组matrix
  • 循环 n + 1 2 \frac{n+1}{2} 2n+1次,每次选中的圈的四个顶点为:
    t o p _ l e f t = [ s i d e , s i d e ] , top\_left = [side, side], top_left=[side,side]
    t o p _ r i g h t = [ s i d e , n − s i d e − 1 ] , top\_right = [side, n-side-1], top_right=[side,nside1]
    b o t t o m _ r i g h t = [ n − s i d e − 1 , n − s i d e − 1 ] , bottom\_right = [n-side-1, n-side-1], bottom_right=[nside1,nside1]
    b o t t o m _ l e f t = [ n − s i d e − 1 , s i d e ] bottom\_left = [n-side-1, side] bottom_left=[nside1,side]
  • 顺时针遍历四条边依次填入递增元素element(1~n2):
    [side, side ~ n-side-1],
    [side+1 ~ n-side-1, n-side-1],
    [n-side-1, n-side-2 ~ side],
    [n-side-2 ~ side+1, side]
  • 注意:当选中的圈的边长为1时,需要及时结束函数,避免重复选入。

整个算法只遍历一次数组,时间复杂度为 O ( n 2 ) O(n^2) O(n2)

运行结果:
在这里插入图片描述

Solution (Java)

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        if(n == 1) return new int[][] {{1}};
        int element = 1;
        for(int i = 0; i < (n+1)/2; i++){
            element = side_order(matrix, n, i, element);
        }
        return matrix;
    }
    private int side_order(int[][] matrix, int n, int side, int element){
        for(int j = side; j < n - side; j++){
            matrix[side][j] = element++;
        }
        if(side == n - side -1) return element;
        for(int i = side + 1; i < n - side; i++){
            matrix[i][n - side -1] = element++;
        }
        for(int j = n - side - 2; j >= side; j--){
            matrix[n - side - 1][j] = element++;
        }
        for(int i = n - side - 2; i >= side + 1; i--){
            matrix[i][side] = element++;
        }
        return element;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值