0
点赞
收藏
分享

微信扫一扫

[每日一道小算法(二十九)] [数组]顺时针打印矩阵(剑指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。

  • 右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错
  • 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同时判断是否和代表左边界的 left 交错
  • 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down 减一,同时判断是否和代表上边界的 up 交错
  • 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 right 交错

代码样例

package com.asong.leetcode.printMatrix;

import java.util.ArrayList;

/**
* 顺时针打印矩阵
* 定义四个变量,不断收缩矩阵 up、down、left、right
*/
public class Solution1 {
public ArrayList<Integer> printMatrix(int[][] matrix)
{
ArrayList<Integer> list = new ArrayList<Integer>();
if(matrix.length == 0 || matrix == null || matrix[0].length == 0)
{
return null;
}
int up = 0;
int down = matrix.length - 1;
int left = 0;
int right = matrix[0].length - 1;
while (true)
{
//最上边的值
for (int col = left; col <= right; col++) {
list.add(matrix[up][col]);
}
//缩小范围
up++;
//判断是否越界
if(up>down)
{
break;;
}
//最右边的值
for (int row = up; row <= down; row++) {
list.add(matrix[row][right]);
}
//缩小范围
right--;
//判断是否越界
if(left>right)
{
break;
}
//最下边的值
for (int col = right; col >= left; col--) {
list.add(matrix[down][col]);
}
//缩小范围
down--;
//判断是否越界
if (up>down)
{
break;
}
//最左边值
for (int row = down; row >= up; row--) {
list.add(matrix[row][left]);
}
//缩小范围
left++;
//判断是否越界
if(left>right)
{
break;
}

}
return list;
}
}


举报

相关推荐

0 条评论