顺时针打印矩阵

题目

顺时针打印矩阵

[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].

解法1

public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        if(matrix == null || matrix.length == 0) return res;
        int R = matrix.length,C = matrix[0].length;
        boolean[][] seen = new boolean[R][C];
        //di 为方向,共4个方向。当 di = 0 时,dr[di],dc[di]的意思是行不变,列加1,即方向为右;同理,di = 2时表示方向为左。
        //dr dc的设计是顺时针方向,从右开始,4个方向为右,下,左,上
        int[] dr = new int[]{0,1,0,-1};
        int[] dc = new int[]{1,0,-1,0};
        int r = 0,c = 0,di = 0;
        for(int i = 0;i < R * C;i++){
            res.add(matrix[r][c]);
            seen[r][c] = true;
            int cr = r + dr[di];//下一步可能移动的位置的行
            int cc = c + dc[di];//下一步可能移动的位置的列
            if(cr >= 0 && cr < R && cc >= 0 && cc < C && seen[cr][cc] == false){
                r = cr;
                c = cc;
            }
            else{
                di = (di + 1) % 4;
                r += dr[di];//一定在矩阵中,没必要进行判断
                c += dc[di];//同上
            }
        }
        return res;
    }

此方法简单,但是空间复杂度较高

解法2

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       if(matrix == null || matrix.length == 0) return null;
        ArrayList<Integer> resList = new ArrayList<Integer>();
        printCircle(matrix, 0, matrix.length - 1, 0, matrix[0].length - 1, resList);
        return resList;

    }

    private void printCircle(int[][] matrix, int startRow, int endRow, int startCol, int endCol, ArrayList<Integer> list){
        int i = 0;
        if(startRow < endRow && startCol < endCol){
            for(i = startCol;i <= endCol;i++) list.add(matrix[startRow][i]);
            for(i = startRow + 1;i <= endRow - 1;i++) list.add(matrix[i][endCol]);
            for(i = endCol;i >= startCol;i--) list.add(matrix[endRow][i]);
            for(i = endRow - 1;i >= startRow + 1;i--) list.add(matrix[i][startCol]);
            printCircle(matrix, startRow + 1, endRow - 1, startCol + 1, endCol - 1, list);
        }
        else if(startRow == endRow && startCol < endCol) 
            for(i = startCol;i <= endCol;i++) list.add(matrix[startRow][i]);
        else if(startCol == endCol && startRow < endRow) 
            for(i = startRow;i <= endRow;i++) list.add(matrix[i][startCol]);
        else if(startCol == endCol && startRow == endRow) list.add(matrix[startRow][startCol]);
        else return;
    }
}

注:算法题目及解法来源于 leetcode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值