lintcode刷题--之字形打印矩阵

来源:互联网 发布:usb数据采集卡驱动 编辑:程序博客网 时间:2024/05/17 03:14

题目:

容易 矩阵的之字型遍历

给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历。样例

对于如下矩阵:

[  [1, 2,  3,  4],  [5, 6,  7,  8],  [9,10, 11, 12]]

返回 [1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12]

方向:右、左下、右上、下;

思路:根据当前位置(i,j)和上一步的方向,决定下一步的方向

代码:

public class Solution {
    /**
     * @param matrix: a matrix of integers
     * @return: an array of integers
     */ 
    public  int[] printZMatrix(int[][] matrix) {
        // write your code here
        if(matrix == null)
            return null;
        int m = matrix.length;
        if(m == 0)
            return null;
        int n = matrix[0].length;
        int[] array = new int[m*n];
        int loc =0;
        if(n == 0)
            return null;
        boolean flag = true;
        int i =0;
        int j =0;
        int RIGHT = 0;
        int LEFTDOWN = 1;
        int DOWN = 2;
        int RIGHTUP = 3;
        int state = -1;
        if(m == 1){
            for(int k=0; k<n;k++){
                array[loc++] = matrix[0][k];
            }
            return array;
        }
        if(n==1){
            for(int k=0; k<m;k++){
                array[loc++] = matrix[k][0];
            }
            return array;
        }
        while(loc < m*n){
                if(i!=0 || j!=0){
                    array[loc++] = matrix[i][j];
                    switch(state){
                        case 0://RIGHT
                            if(i == 0){//LEFTDOWN
                                i++;
                                j--;
                                state = LEFTDOWN;
                            }else{//RIGHTUP
                                j++;
                                i--;
                                state = RIGHTUP;
                            }
                            break;
                        case 1://LEFTDOWN
                            if(j == 0){
                                if(i<m-1){//DOWM
                                    i++;
                                    state = DOWN;
                                }else{
                                    j++;
                                    state = RIGHT;
                                }
                                    
                            }else{//LEFTDOWN
                            if(i == m-1){//RIGHT
                            j++;
                            state = RIGHT;
                            }else{
                            i++;
                            j--;
                            state = LEFTDOWN;
                            }
                            }
                            break;
                        case 2://DOWN
                            if(j==0){
                               // if(i<m-1){//RIGHTUP
                                    i--;
                                    j++;
                                    state = RIGHTUP;
                            }else if(j == n-1){//LEFTDOWN
                                i++;
                                j--;
                                state = LEFTDOWN;
                            }
                            break;
                        case 3://RIGHTUP
                            if(i == 0){
                                if(j != n-1){//RIGHT
                                    j++;
                                    state = RIGHT;
                                }else{//DOWN
                                    i++;
                                    state = DOWN;
                                }
                            }else{
                            if(j == n-1){//DOWM
                            i++;
                                     state = DOWN;
                            } else{//RIGHTUP
                                    j++;
                                    i--;
                                    state = RIGHTUP;
                                }
                            }
                            break;                                                      
                         }
                }else{
                    array[loc++] = matrix[0][0];
                    state = RIGHT;
                    j++;
                }
        }
        return array;
    }
}

0 0
原创粉丝点击