如何在二维数组中找到最大值和最小值的位置

4

我不知道我表达清楚了没有,但是我已经成功打印出最小值和最大值了,但我似乎无法找出它们所在的确切行和列。

以下是我的代码:

double max = m[0][0];
       double min =  m[0][0];
    System.out.println("The matrix is : ");

        for(int i = 0; i < m.length; i++)
        {
            for ( int j = 0; j < m[i].length; j++ )
            {
                System.out.printf("   " + "%6.1f " , m[i][j]);
                if (m[i][j] > max)
                    max = m [i][j];     

                else if
                (m[i][j] < min)
                    min = m [i][j];

我该如何表述他们的位置?例如:(“最大数在第1行,第2列”)之类的内容......像这样的东西。 我真的很感激任何帮助。

3
当你执行max = m[i][j]时,同时也要存储位置信息。因此,在顶部添加double max = m[0][0]; int x = 0; int y = 0;,其中xy是坐标。在max = m[i][j]下面,你需要写上x = i; y = j; - RaminS
一般来说,存储最大值和最小值的最佳方法是在输入数组值时跟踪“运行”最大值和最小值,如果您有这个选项的话。您没有展示如何将值输入到数组中,因此我不知道您是否控制它或者它是外部力量。如果您正在将值输入到数组中,则事后搜索它是不必要且浪费的,考虑到您已经有能力事先知道该信息。 - searchengine27
2个回答

3

看下面的修改。我添加了变量来跟踪最小值和最大值的索引。在循环结束时,您可以简单地打印出maxIndex1maxIndex2minIndex1minIndex2

double max = m[0][0];
double min =  m[0][0];

//declare variables to track the indices of the min and max
int maxIndex1 = -1;
int maxIndex2 = -1;
int minIndex1 = -1;
int minIndex2 = -1;

System.out.println("The matrix is : ");
for(int i = 0; i < m.length; i++)
{
    for ( int j = 0; j < m[i].length; j++ )
    {
        System.out.printf("   " + "%6.1f " , m[i][j]);
        if (m[i][j] > max)
        {
            max = m [i][j]; 
            //record the indices of the new max
            maxIndex1 = i;
            maxIndex2 = j;  
        }  
        else if (m[i][j] < min)
        {
            min = m [i][j];
            //record the indices of the new min
            minIndex1 = i;
            minIndex2 = j;
        }

请注意,如果您有两个相等的值,并且在数组中连接到最大值,则只会记录其中之一。如果您想记录所有最小/最大连接的位置,则可以更改此设置以保存坐标列表而不是单个坐标。

值得注意的是,这仅在矩阵中的最大值和最小值是唯一的情况下才有效,因为您只存储一个位置。 - RaminS
如果你有一个已排序的数组,你可以从else if中省略else - Robert
@Gendarme 我认为这个例子可以实现 OP 的需求,但是值得注意。我编辑了帖子并加入了这一点。 - nhouser9
给楼主:考虑使用多个并行线程来处理数组的第一维,以减少查找最小值和最大值所需的时间。 - searchengine27
如果涉及的数组非常大,@searchengine27 不是一个坏主意。如果它们是正常大小,则此优化是不必要的。 - nhouser9

1

这很容易!只需要声明另外两个变量来存储你的x和y坐标。并在if和else语句中更新它们(别忘了在if和else语句中加上花括号!)就可以了!


2
在这种情况下,花括号不是必需的。 - RaminS
Java规范中if语句的字面语法为if ParExpression Statement [else Statement],其中Statement可以是一个块或单行语句。我同意,花括号是不必要的,完全是可选的和个人偏好。 - searchengine27
1
所以,你的意思是这样就可以了?!如果(m [i] [j]> max)max = m [i] [j]; maxIndex1 = i; maxIndex2 = j; - Ilgorbek Kuchkarov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接