九十一.多维数组和矩阵类型算法题总结——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);
	}
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值