欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

剑指offer:顺时针打印矩阵

程序员文章站 2022-07-12 09:37:48
...

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.

思路:

用minRow,minCol,maxRow,maxCol来控制圈数,每打印完一行,或者一列,相应的最大最小行列数进行加减1。

具体的,分为

step(1)从左往右打印,打印完以后,最小行+1;此时到了最后一列

step(2)从上往下打印,打印完以后,最大列-1;此时到了最后一行

step(3)从右往左打印,打印完以后,最大行-1;此时到了第一列

step(4)从下往上打印,打印完以后,最大行-1;此时到了第二行

这是一圈,剩余的圈数和上面步骤一样。

还有一些具体需要注意的关键点,会在代码中以注释的形式写出来。

实现1:

package com.day01;

import java.util.ArrayList;

class printMatrixDemo {
	/*解题思路:最直观的方法,
	 * 1.从外圈到里圈,一圈一圈打印,
	 * 2. 向内再走一圈,接着循环。
	 * 3. 要返回的数组下标达到n*m时,说明所有的值遍历完了,结束循环。
	 * 
	 * 访问完最小行的每一个元素,最小行+1
	 * 访问完最大行的每一个元素,最大行-1
	 * 访问完最大列中的每个元素,最大列-1
	 * 访问完最小列中的每个元素,最小列+1*/
	 public ArrayList<Integer> printMatrix(int [][] matrix) {
		 if(matrix==null){
			 return null;
		 }
		 int minRow=0;
		 int minCol=0;//最小行,最小列
		 int maxRow=matrix.length-1;
		 int maxCol=matrix[0].length-1;//最大行和最大列
		 int i=0,j=0;//i表示行,j表示列
		 int count=matrix.length*matrix[0].length;
		 ArrayList<Integer> arraylist=new ArrayList<>();
		 //结束的条件:存在链表中的元素个数和二维数组中的元素总个数相等了
		 while(arraylist.size()<count){
			 //从左往右
			 while(j<=maxCol&&arraylist.size()<count){
				 arraylist.add(matrix[i][j++]);
			 }
			 //打印完一行,最小行+1
			 minRow++;
			 //打印完一行的最后一个元素,j就加到了最大索引+1的位置,越界了,所以对j进行-1操作
			 j--;
			 //因为从上往下打印的第一个元素,从左往右打印的时候已经打印过了,所以i+1进入下一行
			 i++;
			 //从上往下打印
			 while(i<=maxRow&&arraylist.size()<count){
				 arraylist.add(matrix[i++][j]);
			 }
			 //打印完一列,最大列-1
			 maxCol--;
			 //打印完一列的最后一个元素后,i++后i越界,所以对i进行-1操作
			 i--;
			 //从右往左打印的第一个元素从上往下已经打印过了,所以j进行-1操作
			 j--;
			 //从右往左打印
			 while(j>=minCol&&arraylist.size()<count){
				 arraylist.add(matrix[i][j--]); 
			 }
			 //打印完一行,最大行-1
			 maxRow--;
			 //j变为-1,越界,j进行+1
			 j++;
			 //从下往上打印的第一个元素从右往左已经打印过了,i-1
			 i--;
			 //从下往上打印
			 while(i>=minRow&&arraylist.size()<count){
				 arraylist.add(matrix[i--][j]);
			 }
			 //打印完一列,最小列+1
			 minCol++;
			 i++;
			 j++;
			 
			 //加上最后一个元素
			 if(arraylist.size()==count-1){
				 arraylist.add(matrix[i][j]);
			 }
		 }
		 
		return arraylist;
	       
	    }
    //测试代码
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 int numbers[][]= {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
		 int numbers2[][]= {{1,2,3},{4,5,6},{7,8,9},};
		 printMatrixDemo pmd=new printMatrixDemo();
		 ArrayList<Integer> list=pmd.printMatrix(numbers2);
		 System.out.println(list.toString());

	}

}

参考了这篇博客的实现方法,https://www.cnblogs.com/yi-hui/p/8892683.html。但是原博客中有一些问题,会造成数组索引越界,我在代码中已经备注出来了。