question:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
解法一:自己的笨逼方法
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<Integer>();
int row = matrix.length; //行数
int column = matrix[0].length; //列数
int count = row>=column?(column+1)/2:(row+1)/2; //读几圈
for(int i=0;i<count;i++){
//读上侧
for(int high=i;high<column-i;high++){
list.add(matrix[i][high]);
}
//读右侧
for(int r=i+1;r<row-i;r++){
list.add(matrix[r][column-i-1]);
}
if(i+1<row-i){ //处理只有一行的情况,此时就不用在读下册要不会和上侧有重复
//读下册
for(int low=column-i-2;low>=i;low--){
list.add(matrix[row-i-1][low]);
}
}
if(column-i-2>=i){ //处理只有一列的情况,否则会和读左侧有重复
//读左侧
for(int l=row-i-2;l>i;l--){
list.add(matrix[l][i]);
}
}
}
return list;
}
}
解法二:思路较为清晰
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<Integer>();
int hr = 0;
int hc = 0;
int lr = matrix.length-1;
int lc = matrix[0].length-1;
while(hr<=lr&&hc<=lc){
print(list,matrix,hr++,hc++,lr--,lc--);
}
return list;
}
public void print(ArrayList<Integer> list,int[][] matrix,int hr,int hc,int lr,int lc){
if(hr==lr){
for(int i=hc;i<=lc;i++){
list.add(matrix[hr][i]);
}
}else if(hc==lc){
for(int i=hr;i<=lr;i++){
list.add(matrix[i][hc]);
}
}else{
int tmpr = hr;
int tmpc = hc;
while(tmpc!=lc){
list.add(matrix[hr][tmpc++]);
}
while(tmpr!=lr){
list.add(matrix[tmpr++][lc]);
}
while(tmpc!=hc){
list.add(matrix[lr][tmpc--]);
}
while(tmpr!=hr){
list.add(matrix[tmpr--][hc]);
}
}
}
}
解法三:优化一下
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
int li = 0;
int lj = 0;
int ri = matrix.length-1;
int rj = matrix[0].length-1;
ArrayList<Integer> res = new ArrayList<>();
while(li<=ri&&lj<=rj){
for(int j=lj;j<=rj;j++){
res.add(matrix[li][j]);
}
for(int i=li+1;i<=ri;i++){
res.add(matrix[i][rj]);
}
for(int j=rj-1;j>=lj&&li!=ri;j--){
res.add(matrix[ri][j]);
}
for(int i=ri-1;i>li&&lj!=rj;i--){
res.add(matrix[i][lj]);
}
li++;
lj++;
ri--;
rj--;
}
return res;
}
}