leetcode 59. Spiral Matrix II (螺旋矩阵)

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

For example,
Given n = 3,

You should return the following matrix:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]
叫你写个螺旋矩阵。。

思路:这种题基本是控制下标。看完题目的第一想法是有点类似走迷宫,那就按这个思路来写吧。

写一个类coordinate,来表示下标,写一个方法nextLocation(Coordinate c,int dir)来返回下一个坐标,dir是方向,

通过dir的值来修改c的值,dir表示四个方向中的其中一个,

dir=1时,下一个坐标是(x-1,y)

dir=2时,下一个坐标是(x,y+1)

dir=3时,下一个坐标是(x+1,y)

dir=4时,下一个坐标是(x,y-1)

最后返回修改后的坐标。

接下来是螺旋矩阵的赋值:先初始化二维数组,默认的值为0;初始方向dir=2,表示往右走;一个坐标tmp,来存储上一个坐标

进入循环,从第一个坐标(0,0)开始,判断dir的值,拿到下一个坐标,是(0,1),判断它的值是否为0,如是则赋值,继续判断dir的值,拿到下一个坐标是(0,2),判断它的值是否为0,如是则赋值...当拿到的下标是(0,3)时,此时判断数组下标是否越界,或者值是否不为0,如果越界会报错,此时转换方向,dir的值++(dir=3),放弃当前的坐标(0,3),拿到上一个坐标tmp(0,2),继续判断dir的值,拿到下一个坐标(1,2)...以此类推,直到赋值变成n^2,结束循环


注意要点:注意输入边界值0、1。输入0对应的值是   ,输入1对应的值是1

注意不能这样写:Coordinate c = new Coordinate(0,0);

Coordinate tmp = c; 这样写会出错,当c改变时,tmp也会跟着变,因为是同一个引用

应该写成Coordinate tmp = new Coordinate();   tmp.setX(c.getX());  tmp.setY(c.getY()); 这样才可以


下面给出代码,哎,改代码只是能ac,效率有点差...等二刷的时候在想其他方法

public class Solution {

    public int[][] generateMatrix(int n) {
        Coordinate c = new Coordinate(0,0);
		Coordinate tmp = new Coordinate();
		int v=2;
		int[][] a = new int[n][n];
		int dir=2;
		if(n == 0)
		{
		    return a;
		}
		else
		{
		    a[0][0]=1;
    		    while(v != (n*n)+1 )
    		   {
    			tmp.setX(c.getX());
    			tmp.setY(c.getY());
    			c = nextLocation(c,dir);			
    			if( (c.getX()==0 && c.getY()==n)||
    				(c.getX()==n && c.getY()==n-1)||
    				(c.getX()==n-1 && c.getY()==-1)||
    				(a[c.getX()][c.getY()] != 0))
    			{
    				dir++;
    				c.setX(tmp.getX());
    				c.setY(tmp.getY());
    			}
    			if(a[c.getX()][c.getY()] == 0)
    			{
    				a[c.getX()][c.getY()] = v;
    				v++;
    			}
    		   }
		}
        return a;
    }
	
	public Coordinate nextLocation(Coordinate c,int dir){
		dir = dir%4;
		if(dir == 0)
		{
			dir=4;
		}
		switch(dir)
		{
			case 1:	c.setX(c.getX()-1); c.setY(c.getY());
					break;
			case 2:	c.setY(c.getY()+1); c.setX(c.getX());
					break;
			case 3:	c.setX(c.getX()+1); c.setY(c.getY());
					break;
			case 4:	c.setY(c.getY()-1); c.setX(c.getX());
					break;
		}
		return c;
	}
}

class Coordinate{
	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	private int x;
	private int y;
	
	Coordinate(){

	}
	
	Coordinate(int x,int y){
		this.x=x;
		this.y=y;
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值