【剑指offer】顺时针打印矩阵

 题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,

例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

则依次打印出数字  1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10

分析

简单来说,就是不断地收缩矩阵的边界
定义四个变量代表范围,up、down、left、right

  1. 向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错
  2. 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同时判断是否和代表左边界的 left 交错
  3. 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down 减一,同时判断是否和代表上边界的 up 交错
  4. 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 right 交错
import java.util.*;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] a) {
        ArrayList<Integer> list = new ArrayList<>();
        if(a.length == 0 || a[0].length == 0 || a == null){
            return list;
        }
        int left = 0;
        int right = a[0].length-1;
        int up = 0;
        int down = a.length-1;
        
        while(true){
            for(int i = left; i <= right;i++){
                list.add(a[up][i]);
            }
            up++;
            if(up > down){
                break;
            }
            for(int i = up;i <= down;i++){
                list.add(a[i][right]);
            }
            right--;
            if(right < left){
                break;
            }
            for(int i = right;i>=left;i--){
                list.add(a[down][i]);
            }
            down--;
            if(down<up){
                break;
            }
            for(int i = down;i>=up;i--){
                list.add(a[i][left]);
            }
            left++;
            if(left>right){
                break;
            }
        }
        return list;
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值