题1:顺时针打印二维数组
static void print(int[][] matrix){
int leftUpRow=0,leftUpCol=0,rightDownRow=matrix.length-1,rightDownCol=matrix[0].length-1;
while(leftUpRow<=rightUpRow&&leftUpCol<=rightDownCol){
//在不是方阵的情况下,是扁平的时,左右或是上下间距小的先结束,
//也就是说最后肯定剩一行,无论是竖着一行还是横着一行,上一行结束后,
//上下左右边界改变,间距小的合并到一起,当遍历到头时,由于有一个间距已经变为0,
//有些while循环无法实现,只有间距不为0那个方向可以动,因此当结束时,
//再次更新边界,两个为0的边界就交叉了,循环结束
// leftUpCol
//leftUpRow 0
// length rightDownRow
// rightDownCOl
//两个移动指针
int r=leftUpRow;
int c=leftUpCol;
//上面一条边
while(c<=rightUpCol){
System.out.println(matrix[leftUpRow][c++]+" ");
}
//恢复
c=rightDownCol;
r++;
//右边的一条边
while(r<=rightDownRow){
System.out.println(matrix[r++][leftUpCol]+" ");
}
//恢复
r=rightDownRow;
c--;
//下面一条边
while(c>=RightDown){
System.out.println(matrix[r][c--]+" ");
}
//恢复
c=leftUpCol;
r--;
while(r>leftUpRow){
System.out.println(matrix[r--][c]);
}
一圈后回到左顶角
leftUpRow++;
leftUpCol++;
rightUpRow--;
rightUpCol--;
}
}
题2:0所在的行列清零
如果矩阵中某个元素为0,则将其所在行和列清零
1 2 3 4
5 6 0 8
9 0 11 12
13 14 15 16
先记录再求解决
static void solve(int[][] matrix){
int M=matrix.length;
int N=matrix[0].length;
//记录那些行出现了0
int[] rowRecord=new int[M];
//记录那些列出现了0
int[] colRecord=new int[N];
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
if(matrix[i][j]==0){
rowRecord[i]=1;
colRecord[j]=1;
}
}
}
for(int row=0;row<M;row++){
for(int col=0;col<N;col++){
if(rowRecord[row]==1||colRecord[col]==1)
matrix[row][col]=0;
}
}
}
题3:z型打印
1 2 3 4
5 6 7 8
9 10 11 12
static void print(int[][] matrix){
int r=0;m=matrix.length;//行的长度
int c=0;n=matrix[0].length;//每一列的长度
boolean l2r=true;//从左到右
while(r<m&&c<n){//全都遍历完,才终止条件
//从左下到右上的斜线,若是到边界,则这个条件结束
if(12r){
System.out.println(matrix[r][c]+" ");
//现在在第一行,列未到边界,这是只能向左走
//在上和右边界,都要调换方向,从上破转到下坡
if(r==0&&c<n-1){//走上坡的终止条件,当到达最上方且未到最右方,就往右走一步
l2r=!l2r;//掉换方向,从上坡到下坡
c++;
continue;
}else if(r>0&&c=n-1){
l2r=!l2r;
r++;
continue;
}else{//急需走上坡
r--;
c++;
}else{//走上坡结束,该走下坡了
//在左和下边界,都要调换方向,从下坡上坡
System.out.println(matrix[i][j]+" ");
if(c==0&&r<m-1){//走下坡的边界,若是碰到
l2r=!l2r;
r++;
continue;
}else if(r==m-1){
l2r=!l2r;
c++;
continue;
}else{
r++;
c--;
}
}
}
}
题4:边长为1的最大子方阵
给定一个N*N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度
//外围循环为边长,内层循环为在该边长下,每个点位作为左上顶点,遍历四条边,看是否有0,若有0,则该方阵不成立,若没有0,则此方阵为最大子方阵
private static int solve(int[][] A){
int N=A.length;
int n=N;
while(n>0){
for(int i=0;i<N;i++){
l3;
if(i+n>N)break;//越界
for(int j=0;j<N;j++){
if(j+n>N)break;//越界
//检查四个边
int r=i,c=j;
while(c<j+n){
if(A[r][c++]==0)continue l3;
}
c--
while(c<j+n){
if(A[r++][c]==0)
continue l3;
}
r--;
while(c>=j){
if(A[r][c--]==0)
continue l3;
}
c++;
while(r>=i){
if(A[r--][c]==0)
continue l3;
}
//若是都没有退出,则这就最大的边长,因为外围为边长,他是从大到小遍历的
return n;
}
}
}
}