我必须创建一个程序来添加二维数组的列并返回最小的总和。这是我写的程序,但我想知道是否有更有效的方法。主程序是由教授给我们的。我想知道是否有这样做的方法,而不必为每列声明一个整数,因为如果它不总是3列,谢谢。
#include <iostream>
#include <string>
using namespace std;
int smallCol( int x[][3], int row, int col){
int c1 = 0;
int c2 = 0;
int c3 = 0;
int min;
for (int r = 0; r < row; r++){
for(int c = 0; c < col; c++ ){
if(c==0)
c1 += x[r][c];
if(c==1)
c2 += x[r][c];
if(c==2)
c3 += x[r][c];
}
}
min = c1;
if(c2 < c1)
min = c2;
if(c3 < c2)
min = c3;
return min;
}
int main() {
int x[2][3] = {{3, 1, 4}, {1, 5, 9}};
cout << "Smallest column sum is " << smallCol (x, 2, 3) << endl;
// from the 2-d array x that has size 2 x 3, find the smallest col sum
// output will be 4 since col#0 contains 3 and 1 is smallest.
return 0;
}
答案 0 :(得分:2)
如果切换嵌套循环,则只能使用一个变量:
#include <limits>
int smallCol( int x[][3], int row, int col){
int min = std::numeric_limits<int>::max();
// or something really big... like 2147483647
for (int c = 0; c < col; ++c ) {
int sum = 0;
for(int r = 0; r < row; ++r ) {
sum += x[r][c];
}
if ( min > sum ) {
min = sum;
}
}
return min;
}
修改强>
如果您无法修改程序的主要结构,则可以使用向量存储部分总计,然后扫描它以找到最小值:
std::vector<int> sums(col);
for (int r = 0; r < row; ++r ) {
for(int c = 0; c < col; ++c ) {
sums[c] += x[r][c];
}
}
for( int c = 0; c < col; ++c ) {
if ( min > sums[c] ) {
min = sums[c];
}
}
由于内存中元素的连续性,这对于非常大的矩阵来说可能更加缓存,从而导致更快的代码。
答案 1 :(得分:2)
更改嵌套循环的顺序,因此首先循环遍历列并计算该列中所有行的总计。然后,您不需要每列总数的变量。
int min;
for (int c = 0; c < col; c++) {
int total = 0;
for (int r = 0; r < row; r++) {
total += x[r][c];
}
if (c == 0 || total < min) {
min = total;
}
}
c == 0
测试会对第一列进行特殊处理,因此会将min
初始化为第一列的总计。其余列将与之比较。
答案 2 :(得分:0)
int smallCol
{
auto min = std::numeric_limits<int>::max();
for (auto i = 0; i < col; ++i)
{
auto m = std::accumulate(x, x + row, 0, [i](int sum, auto && row) { return sum + row[i]; });
if (m < min) min = m;
}
return min;
}