我试图在矩阵中找到最大值。我在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(代码变得混乱)。
我知道如何使用另外两个循环(迭代找到第二个位置并进行比较),但有没有办法只用两个循环(而不是四个)来完成它?
答案 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然后那里有。