在处理关系案例的同时在矩阵中找到最大值[在C中]

时间:2018-06-09 19:51:52

标签: c algorithm matrix

我试图在矩阵中找到最大值。我在C中这样做了:

int max = matrix[0][0], max_i = 0, max_j = 0;
for(int i = 0; i < 10; i++) {
    for(int j = 0; j < 10; j++) {
        if(matrix[i][j] > max) {
            max = matrix[i][j];
            max_i = i;
            max_j = j;
        } 
    }
}

但是,如果我想知道是否有领带怎么办?在这种情况下,我希望我的函数返回-1。我虽然使用另一个变量来保持第二个最高值,但在这种情况下,我需要使用另外两个变量:second_max_i和second_max_j(代码变得混乱)。

我知道如何使用另外两个循环(迭代找到第二个位置并进行比较),但有没有办法只用两个循环(而不是四个)来完成它?

2 个答案:

答案 0 :(得分:2)

如果您遇到与当前最大值相同的其他元素,则可以通过跟踪来实现此目的。如果这样做,请设置“tie”标志。每当您找到新的最大值时,请清除“tie flag”,如下所示:

int max = matrix[0][0], max_i = 0, max_j = 0, tie = 0;

for(int i = 0; i < 10; i++) {
    for(int j = 0; j < 10; j++) {
        if(matrix[i][j] == max) {
            tie = 1;
        }
        else if(matrix[i][j] > max) {
            max = matrix[i][j];
            tie = 0;
            max_i = i;
            max_j = j;
        } 
    }
}

然后,如果tie == 1,您可以返回-1。

编辑添加:请注意,使用当前代码,您初始化int max = matrix[0][0],并且您检查的第一个元素也是matrix[0][0]。因此,如果matrix[0][0]是您的最大元素,您将错误地检测到平局。为了防止这种情况,如果您知道矩阵永远不会包含低于某个值的值,则可以将max初始化为低于该值的值。例如,如果您可以保证矩阵只包含非负整数,则可以初始化int max = -1

答案 1 :(得分:0)

请考虑以下代码段:

int dancers = [[1,2], [3,4]];
int max = -1, max_i = -1, max_j = -1;
for(int i = 0; i < 2; i++) {
    for(int j = 0; j < 2; j++) {
        if(matrix[i][j] > max) {
            max = dancers[i][j];
            max_i = i;
            max_j = j;
        } 
        else if(matrix[i][j] == max){
            max_i = -1;
            max_j = -1;
        }
    }
}

if(max_i == -1 && max_j == -1){
  max = -1;
}

现在你可以检查最大数量是否有赢家,如果它是-1然后那里有。