leetcode 54. Spiral Matrix

下面的处理是一个非常笨拙的方法:acc,  考虑边界条件,调试出现很多问题。

import java.util.ArrayList;
import java.util.List;

public class Solution {
	public static void main(String[] args){
		int num[][]  = new int[2][2];
		int cnt = 1;
		for(int i=0;i<2;i++){
			for(int j=0;j<2;j++)
				num[i][j] = cnt++;
		}
		Solution s = new Solution();
		List<Integer> res = s.spiralOrder(num);
	}
	
	
	public int move(int[][] matrix, List<Integer> res, int i, int j, boolean m_l, boolean m_r, boolean m_u, boolean m_d){
		int re = 0;
		if(m_r){
			int k;
			re = j;
			for(k=j;k<matrix[0].length;k++){
				if(matrix[i][k]!=Integer.MAX_VALUE){
					re = k;
					res.add(matrix[i][k]);
					matrix[i][k]=Integer.MAX_VALUE;
				}else{
					break;
				}
			}
		}
		if(m_l){
			int k;
			re = j;
			for(k=j;k>=0;k--){
				if(matrix[i][k]!=Integer.MAX_VALUE){
					re = k;
					res.add(matrix[i][k]);
					matrix[i][k]=Integer.MAX_VALUE;
				}
				else{
					break;
				}
			}
		}
		
		if(m_u){
			int k;
			re = i;
			for(k=i;k>=0;k--){
				if(matrix[k][j]!=Integer.MAX_VALUE){
					re = k;
					res.add(matrix[k][j]);
					matrix[k][j]=Integer.MAX_VALUE;
				}else{
					break;
				}
			}
		}
		
		if(m_d){
			int k;
			re = i;
			for(k=i;k<matrix.length;k++){
				if(matrix[k][j]!=Integer.MAX_VALUE){
					re = k;
					res.add(matrix[k][j]);
					matrix[k][j]=Integer.MAX_VALUE;
				}else{
					break;
				}
			}
		}
		return re;
	}
	
	
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<Integer>();
        int m = matrix.length;    // row
        if(m==0)  return res;
        int n = matrix[0].length; // column
        System.out.print(m);
        System.out.print(n);
        //List<Integer> res = new ArrayList<Integer>();
        int s_i = 0, s_j=0;
        boolean found = true;
        boolean n_r = false;
        boolean n_l = false;
        boolean n_u = false;
        boolean n_d = false;
        if(s_i==0&&s_j==0){
        	n_r = true;
        	s_j = move(matrix,res,0,0,n_l,n_r,n_u,n_d);
        	n_r = false;
        }
        while(found){
        	    System.out.print(s_j);
        		if(s_i+1<m&&matrix[s_i+1][s_j]!=Integer.MAX_VALUE)  {
        			n_d = true;  //down
        			s_i = s_i+1;
        			s_i = move(matrix,res,s_i,s_j,n_l,n_r,n_u,n_d);
        		}
        		else if(s_i-1>=0&&matrix[s_i-1][s_j]!=Integer.MAX_VALUE)  {
        			n_u = true;  //up 
        			s_i = s_i - 1;
        			s_i = move(matrix,res,s_i,s_j,n_l,n_r,n_u,n_d);
        		}
        		else if(s_j+1<n&&matrix[s_i][s_j+1]!=Integer.MAX_VALUE)  {
        			n_r = true;  //right
        			s_j = s_j + 1;
        			s_j = move(matrix,res,s_i,s_j,n_l,n_r,n_u,n_d);
        		}
        		else if(s_j-1>=0&&matrix[s_i][s_j-1]!=Integer.MAX_VALUE)  {
        			n_l = true;  //left
        			s_j = s_j -1;
        			s_j = move(matrix,res,s_i,s_j,n_l,n_r,n_u,n_d);
        		}else{
        			found = false;
        		}
        		//if(found)
        	n_r = false;
            n_l = false;
            n_u = false;
            n_d = false;
        }
        return res;
    }
}




螺旋性转圈,还没有编译通过,草稿,设计移动规则

public class Solution {
	public void move(int[][] matrix, List<Integer> res,int i,int j, boolean m_l, boolean m_r, boolean m_u, boolean m_d){
		if(m_r){
			for(int k=j;k<matrix.length;k++){
				if(matrix[i][k]!=Integer.MAX_VALUE){
					res.add(matrix[i][k]);
					matrix[i][k]=Integer.MAX_VALUE;
				}
			}
		}
		
		if(m_l){
			for(int k=j;k>=0;k--){
				if(matrix[i][k]!=Integer.MAX_VALUE){
					res.add(matrix[i][k]);
					matrix[i][k]=Integer.MAX_VALUE;
				}
			}
		}
		
		if(m_u){
			for(int k=i;k>=0;k--){
				if(matrix[i][k]!=Integer.MAX_VALUE){
					res.add(matrix[i][k]);
					matrix[i][k]=Integer.MAX_VALUE;
				}
			}
		}
		
		if(m_d){
			for(int k=i;k<matrix.length;k++){
				if(matrix[i][k]!=Integer.MAX_VALUE){
					res.add(matrix[i][k]);
					matrix[i][k]=Integer.MAX_VALUE;
				}
			}
		}
	}
	
	
    public List<Integer> spiralOrder(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        System.out.print(m);
        System.out.print(n);
        List<Integer> res = new ArrayList<Integer>();
        int s_i = 0, s_j=0;
        res.add(matrix[0][0]);
        matrix[0][0] = Integer.MAX_VALUE;
        boolean found = true;
        boolean n_r = false;
        boolean n_l = false;
        boolean n_u = false;
        boolean n_d = false;
        while(found){
        	if(s_i==0&&s_j==0){
        		n_r = true;
        		move(matrix,res,0,1,n_r,n_l,n_u,n_d);
        	}else{
        		if(s_i+1<m&&matrix[s_i+1][s_j]!=Integer.MAX_VALUE)  {
        			n_d = true;
        			s_i = s_i+1;
        		}
        		else if(s_i-1>0&&matrix[s_i-1][s_j]!=Integer.MAX_VALUE)  {
        			n_u = true;
        			s_i = s_i - 1;
        		}
        		else if(s_j+1<n&&matrix[s_i][s_j+1]!=Integer.MAX_VALUE)  {
        			n_r = true;
        			s_j = s_j + 1;
        		}
        		else if(s_j-1<n&&matrix[s_i][s_j-1]!=Integer.MAX_VALUE)  {
        			n_l = true;
        			s_j = s_j -1;
        		}else{
        			found = false;
        		}
        		if(found) move(matrix,res,0,1,n_r,n_l,n_u,n_d);
        	}
        }
        
        
        return res;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>