九十一.多维数组和矩阵类型算法题总结——JAVA

题一:顺时针打印二维数组
在这里插入图片描述

import java.util.Scanner;

public class LianXi {
    
    
	
	public static void print(int[][] arr){
    
    
		int leftUpRow = 0, leftUpCol = 0, rightDownRow = arr.length-1, rightDownCol = arr[0].length - 1;
		while(leftUpRow <= rightDownRow && leftUpCol<= rightDownCol){
    
    
			int r = leftUpRow ,c = leftUpCol;
			while(c <= rightDownCol){
    
    
				System.out.print(arr[r][c++] + " ");
			}
			c = rightDownCol;
			r++;
			while(r <= rightDownRow){
    
    
				System.out.print(arr[r++][c] + " ");
			}
			r = rightDownRow;
			c--;
			while(c >= leftUpCol){
    
    
				System.out.print(arr[r][c--] + " ");
			}
			c = leftUpRow;
			r--;
			while(r > leftUpRow){
    
    
				System.out.print(arr[r--][c] + " ");
			}
			leftUpRow++;leftUpCol++;rightDownRow--;rightDownCol--;		
		}
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		int N = in.nextInt();
		int M = in.nextInt();
		int[][] arr = new int[N][M];
		for(int i = 0; i<N; i++){
    
    
			for(int j = 0; j<M; j++){
    
    
				arr[i][j] = in.nextInt();
			}
		}
		System.out.println("矩阵为:");
		for(int i = 0; i<N; i++){
    
    
			for(int j = 0; j<M; j++){
    
    
				System.out.print(arr[i][j] + " ");
			}
			System.out.print("\n");
		}
		System.out.println("顺时针打印:");
		print(arr);
	} 
}

在这里插入图片描述
题二:0所在的行列清零
在这里插入图片描述

import java.util.Scanner;

public class LianXi {
    
    
	
	public static void print(int[][]arr){
    
    
		int M = arr.length;
		int N = arr[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(arr[i][j] == 0){
    
    
					rowRecord[i] = 1;
					colRecord[j] = 1;
				}
			}
		}
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				if(rowRecord[i]==1 || colRecord[j]==1){
    
    
					arr[i][j] = 0;
				}
			}
		}
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		int M = in.nextInt();
		int N = in.nextInt();
		int[][] arr = new int[M][N];
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				arr[i][j] = in.nextInt(); 
			}
		}
		System.out.println("原始矩阵为:");
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				System.out.print(arr[i][j] + " ");
			}
			System.out.print("\n");
		}
		print(arr);
		System.out.println("结果为:");
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				System.out.print(arr[i][j] + " ");
			}
			System.out.print("\n");
		}
	}
}

在这里插入图片描述
题三:Z形打印
在这里插入图片描述

import java.util.Scanner;

public class LianXi {
    
    
	
	public static void print(int[][]arr){
    
    
		int r = 0, m = arr.length;
		int c = 0, n = arr[0].length;
		boolean l2r = true;  //从左到右
		while(r<m && c<n){
    
    
			//从左下到右上的斜线
			if(l2r){
    
    
				System.out.print(arr[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.print(arr[r][c] + " ");
				if(r<m-1 && c==0){
    
     //走到第一列,只能往下走
					l2r = !l2r;
					r++;
					continue;
				}else if(r == m-1){
    
    
					l2r = !l2r;
					c++;
					continue;
				}
				else{
    
    
					r++;
					c--;
				}
			}
		}
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		int M = in.nextInt();
		int N = in.nextInt();
		int[][] arr = new int[M][N];
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				arr[i][j] = in.nextInt(); 
			}
		}
		System.out.println("原始矩阵为:");
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				System.out.print(arr[i][j] + " ");
			}
			System.out.print("\n");
		}
		System.out.println("结果为:");
		print(arr);
	}
}

在这里插入图片描述
题四:找出边界为1的最大子方阵
在这里插入图片描述

public class LianXi {
    
    
	
	public static int print(int[][] arr){
    
    
		int N = arr.length;
		int n = N;
		while(n>0){
    
    
			for(int i = 0; i<N; i++){
    
    
				if(i + n > N) break;
			    l3:	
				for(int j = 0; j<N; j++){
    
    
					if(j+n > N)  break;
					//检查四个边
					int r = i;
				    int c = j;
				    //上
				    while(c < j+n){
    
    
				    	if(arr[r][c++] == 0)  
				    		continue l3;
				    }
				    c--;
				    //右
				    while(r < i+n){
    
    
				    	if(arr[r++][c] == 0)  
				    		continue l3;
				    }
				    r--;
				    //下
				    while(c >= j){
    
    
				    	if(arr[r][c--] == 0) continue l3;
				    }
				    c++;
				    //左
				    while(r >= i){
    
    
				    	if(arr[r--][c] == 0) continue l3;
				    }
				    r++;
				    return n;
				}
			}
			n--;
		}
		return 0;
	}
	
	public static void main(String[] args){
    
    
		int[][] arr = {
    
    {
    
    0,1,1,1,1},
				       {
    
    0,1,0,0,1},
				       {
    
    0,1,0,0,1},
				       {
    
    0,1,1,1,1},
				       {
    
    0,1,0,1,1}};
		int res = print(arr);
		System.out.print(res);
	}
}

题五:子数组最大累加和
在这里插入图片描述

暴力解法:

import java.util.Scanner;

public class LianXi {
    
    
	
	public static void getMaxSum(int[] arr){
    
    
		int maxSum = arr[0];
		for(int j = 0; j<arr.length;j++){
    
    
			int maxj = arr[j];
			for(int i = j+1; i<arr.length; i++){
    
    
				maxj += arr[i];
				if(maxj>maxSum){
    
    
					maxSum = maxj;
				}
			}
		}
		System.out.println(maxSum);
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		int N = in.nextInt();
		int[] arr = new int[N];
		for(int i = 0; i<N;i++){
    
    
			arr[i] = in.nextInt();
		}
		getMaxSum(arr);
	}
}

递推法:

import java.util.Scanner;

public class LianXi {
    
    
	
	public static void getMaxSum(int[] arr){
    
    
		int sumj = arr[0];
		int maxSum = sumj;
		for(int j = 1; j<arr.length; j++){
    
    
			if(sumj > 0){
    
    
				sumj += arr[j];
			}
			else{
    
    
				sumj = arr[j];
			}
			if(sumj > maxSum){
    
    
				maxSum = sumj;
			}
		}
		System.out.println(maxSum);
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		int N = in.nextInt();
		int[] arr = new int[N];
		for(int i = 0; i<N;i++){
    
    
			arr[i] = in.nextInt();
		}
		getMaxSum(arr);
	}
}

在这里插入图片描述
题六:求子矩阵最大累加和
在这里插入图片描述

import java.util.Arrays;
import java.util.Scanner;

public class LianXi {
    
    
	
	public static int maxSum(int[][] matrix){
    
    
		int beginRow = 0;
		final int M = matrix.length;
		final int N = matrix[0].length;
		int[] sums = new int[N]; //按列求和
		int max = 0;
		while(beginRow<M){
    
      //起始行
			for(int i = beginRow; i<M; i++){
    
      //从起始行到第i行
				//按列累加
				for(int j = 0; j<N; j++){
    
    
					sums[j] += matrix[i][j];
				}
				//累加完成
				int t = getMaxSum(sums);
				if(t>max){
    
    
					max = t;
				}
				//另起一行作为起始行,把sums清零
				Arrays.fill(sums, 0);  //快速地将sum的每个元素都设定为0
				beginRow++;
			}
		}
		return max;
	}
	
	public static int getMaxSum(int[] arr){
    
    
		int sumj = arr[0];
		int maxSum = sumj;
		for(int j = 1; j<arr.length; j++){
    
    
			if(sumj > 0){
    
    
				sumj += arr[j];
			}
			else{
    
    
				sumj = arr[j];
			}
			if(sumj > maxSum){
    
    
				maxSum = sumj;
			}
		}
		return maxSum;
	}
	
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		int M = in.nextInt();
		int N = in.nextInt();
		int[][] arr = new int[M][N];
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				arr[i][j] = in.nextInt(); 
			}
		}
		int res = maxSum(arr);
		System.out.println(res);
	}
}

在这里插入图片描述
矩阵运算
在这里插入图片描述

import java.util.Arrays;
import java.util.Scanner;

public class LianXi {
    
    
	
	public static void getX(int[][]A, int[][]B, int M, int N){
    
    
		int [][] X = new int[M][N];
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				X[i][j] = (B[i][j] - A[i][j]) / 2;
			}
		}
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				System.out.print(X[i][j] + " ");
			}
			System.out.print("\n");
		}
	}
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		int M = in.nextInt();
		int N = in.nextInt();
		int[][] A = new int[M][N];
		int[][] B = new int[M][N];
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				A[i][j] = in.nextInt();
			}
		}
		System.out.println("A矩阵为:");
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				System.out.print(A[i][j] + " ");
			}
			System.out.print("\n");
		}
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				B[i][j] = in.nextInt();
		    }
		}
		
		System.out.println("B矩阵为:");
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				System.out.print(B[i][j] + " ");
			}
			System.out.print("\n");
		}
		System.out.println("X矩阵为:");
		getX(A,B,M,N);
	}
}

在这里插入图片描述
矩阵乘法
在这里插入图片描述

import java.util.Arrays;
import java.util.Scanner;

public class LianXi {
    
    
	
	public static void getX(int[][]A, int[][]B, int M, int N, int k){
    
    
		int [][] X = new int[M][k];
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<k; j++){
    
    
				for(int o = 0; o<N; o++)
				X[i][j] += A[i][o] * B[o][j]; 
			}
		}
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<k; j++){
    
    
				System.out.print(X[i][j] + " ");
			}
			System.out.print("\n");
		}
	}
	public static void main(String[] args){
    
    
		Scanner in = new Scanner(System.in);
		int M = in.nextInt();
		int N = in.nextInt();
		int K = in.nextInt();
		int[][] A = new int[M][N];
		int[][] B = new int[N][K];
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				A[i][j] = in.nextInt();
			}
		}
		System.out.println("A矩阵为:");
		for(int i = 0; i<M; i++){
    
    
			for(int j = 0; j<N; j++){
    
    
				System.out.print(A[i][j] + " ");
			}
			System.out.print("\n");
		}
		
		for(int i = 0; i<N; i++){
    
    
			for(int j = 0; j<K; j++){
    
    
				B[i][j] = in.nextInt();
		    }
		}		
		System.out.println("B矩阵为:");
		for(int i = 0; i<N; i++){
    
    
			for(int j = 0; j<K; j++){
    
    
				System.out.print(B[i][j] + " ");
			}
			System.out.print("\n");
		}
		System.out.println("X矩阵为:");
		getX(A,B,M,N,K);
	}
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/JiangYu200015/article/details/114414381