二维数组行列差

发布时间:2024年01月18日

描述

一个二维数组 a 的大小为 n×n。定义 b i为数组 a 中第 i 行元素的总和,而 c j为第 j 列元素的总和。接着,定义 d i? 为第 i 行和列和的差的绝对值,即 ∣b i ?c i ∣。给定这个二维数组 a,逐行输出所有 d i? 的值,其中 1≤i≤n,每个 d i 的值输出在一行上。

输入描述

第一行,包含一个整数 n。
接下来 n 行,每行包含 n 个整数。

输出描述

共 n 行,每行一个整数,其中第 i 行表示 d i? 。

测试样例

样例输入 1

3
1 2 3
4 6 1
2 3 3

样例输出 1

1
0
1

提示

数据范围与提示

1<n≤1000,1≤b i,a i? ≤10000

题解

这个题要多次for循环,输入时候遍历一次,计算行之和要遍历一次,计算列之和还要遍历一次,最后计算d数组也要遍历一次。时间复杂度很高。

所以我们就在输入数组的时候,就把行之和先计算出来,然后再遍历一次计算列之和,这样就少了一次循环。

然后就是内存,一个二维数组是肯定要开的,行之和也需要一个数组,列的话和d数组其实不用开,可以在遍历列的时候就把列和d都计算出来直接输出,其实我试了一下开三个数组也是没问题的,内存足够能过。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4;
int a[N][N],rowNum[N],colNum[N];
int main(){
	int n;
	cin >> n;
	for(int i=0;i<n;i++){
		int row = 0;//统计行
		for(int j = 0;j < n;j ++){
			cin >> a[i][j];
			row+=a[i][j];
		}
		rowNum[i] = row;
	}
	for(int i=0;i<n;i++){
		int col = 0;//统计列
		for(int j = 0;j < n;j ++){
			col+=a[j][i];
		}
		colNum[i] = col;
	}
	for(int i=0;i<n;i++){
		cout << abs(rowNum[i]-colNum[i])<<endl;
	}
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4;
int a[N][N],rowNum[N],colNum[N];
int main(){
	int n;
	cin >> n;
	for(int i=0;i<n;i++){
		int row = 0;//统计行
		for(int j = 0;j < n;j ++){
			cin >> a[i][j];
			row+=a[i][j];
		}
		rowNum[i] = row;
	}
	for(int i=0;i<n;i++){
		int col = 0;//统计列
		for(int j = 0;j < n;j ++){
			col+=a[j][i];
		}
		cout << abs(col-rowNum[i]) <<endl; //这一步直接计算d输出了
	}
	return 0;
}
文章来源:https://blog.csdn.net/L6666688888/article/details/135668724
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。