在每一行和每一列中找到第二高的数字之和

时间:2018-08-17 20:25:50

标签: java arrays

2D数组中的每个元素都被视为巧克力。除了每一行和每一列的最大巧克力数量之外,我需要选择最大数量的巧克力。我编写了一个程序,但是对于下面提到的示例,它没有产生正确的结果。

1 4 0 5 2 | 4
2 1 2 0 1 | 1
0 2 3 4 4 | 3
0 3 0 3 1 | 1
1 2 2 1 1 | 1

列:1+3+2+4+2=12

行:4+1+3+1+1=10

总计:12+10=22

输出应为22​​,但我下面连接的程序的输出为20。

public int calc(int[][] grid, int rows, int columns){

    int[][] check = new int[rows][columns];

    int max, pos;

    for(int i=0; i<rows; i++){
        max = grid[i][0];
        pos = 0;
        for(int j=0; j<columns; j++){
            if(grid[i][j] >= max){
                max = grid[i][j];
                pos = j;
            }
        }
        check[i][pos] = 1;
    }

    for(int j=0; j<columns; j++){
        max = grid[0][j];
        pos = 0;
        for(int i=0; i<rows; i++){
            if(grid[i][j] >= max){
                max = grid[i][j];
                pos = i;
            }
        }
        check[pos][j] = 1;
    }

    int total = 0;
    for(int i=0; i<rows; i++){
        for(int j=0; j<columns; j++){
            if(check[i][j]!=1){
                total += grid[i][j];
            }
        }
    }
    return total;
}

1 个答案:

答案 0 :(得分:0)

您的应用程序没有考虑到列中的max和行中的max可能是同一元素(或可选地)。例如,行1具有2 1 2 0 1。第一个2是第0列的max,但两个2都是第1行的最大值。您的应用程序将第一个2标记为第{{1 }},第二个max作为第一个循环中的行2

请注意,第二行中的值max也存在类似情况,但是在这种情况下,您的应用程序仅将4中的一个标记为最大值(因为您正在检查两个循环中的4如果只检查>= max,则> max在第1行中是正确的,但您的2在第2行中会被弄乱)。

如果您的示例肯定要返回22,则您需要添加逻辑以检查行和列上4值的交集。

以下是蛮力更新,保留了您大多数的逻辑/结构。我更新了max数组以保留找到的最大值,而不是仅保留check,并添加了一个附加的嵌套循环,该循环检查每行是否有相等的1值。在上一个循环中,我将max的检查更新为!=1

==0