Leetcode 54 spiral matrix II (螺旋矩阵)

一,问题描述

1,给定一个数n,以螺旋顺序产生一个具有n*n个元素的正方形矩阵。

2,格式如下:
输入: 3
输出: [1 2 3]
[8 9 4]
[7 6 5]

输入:4
输出:[1 2 3 4]
[12 13 14 5]
[11 16 15 6]
[10 9 8 7].

3,解题思路:
第一, 这题的解题思路和第54题(spiral matrix)是相似的,这两题可以结合一起做的。
第二 ,这题的思路如下:
首先,一次循环如下:把数组的第一行从左到后赋值递增的数(1,2,…),然后再把数组最后一列从上到下赋值递增的数,然后再把数组的最后一行,从右到左赋值递增的数。最后把数组的第一列从下到上赋值递增的数。这是一次循环。然后行减去2行(就是第一行和最后一行),列减去2列(就是第一列和最后一列),继续上述的循环操作。直到赋值的数大于n*n。

二,AC了的程序(用Java实现的)

import java.util.*;
public class Test2{

    public int[][] generateMatrix(int n)
    {
        List<Integer> list=new ArrayList<Integer>();
        int [][]data=new int[n][n];
        if(n==0)
        {
            return data;
        }
        int hang=n;   //表示行
        int lie=n;    //表示列
        int temp=1;

        for(int i=0,j=0;i<hang&&j<lie;i++,j++)
        {
            //每一次循环完后,i和j各加1
            for(int linlie=j;linlie<hang;linlie++)  //当n=3时, 把数组的第一行从左到有存入1,2,3
            {
                data[i][linlie]=temp;
               // System.out.println("data[+"+i+"][+"+linlie+"]="+data[i][linlie]);
                temp++;
            }

            for(int linhang=i+1;linhang<lie;linhang++)  //把数组的最后一列从上到下存入 4,5
            {
                data[linhang][hang-1]=temp;
                temp++;
            }

            for(int linlie=hang-2;linlie>=j&&i!=(hang-1);linlie--) //把数组的最后一行从右到左存入,6 7
            {
                data[hang-1][linlie]=temp;
                temp++;
            }

            for(int linhang=lie-2;linhang>i&&j!=(lie-1);linhang--)  //把数组的第一列,从下到上依次存入,8,(因为1已经存过
            {
                data[linhang][j]=temp;
                temp++;
            }
            hang--;  //然后行减去一
            lie--;  //列减去一,
            if(temp>n*n)
            {
                break;
            }

        }

        return data;

    }

    public static void main(String []args)
    {
        Test2 test=new Test2();
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();

        int [][]result=test.generateMatrix(n);

        for(int i=0;i<result.length;i++)
        {
            for(int j=0;j<result[i].length;j++)
            {
                System.out.print(result[i][j]+" ");
            }
            System.out.println();
        }

        System.out.println();
    }
}

运行结果:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值