在2D数组中查找第二大元素

时间:2019-10-26 14:38:18

标签: c++

我的程序应该在2D数组中找到两个最大的元素。第一个元素一切正常,程序认为它是正确的,但是第二个元素存在很大的问题,因为我得到了错误的值。我知道有关于在数组中查找第二大元素的信息,但对于2D数组我找不到任何东西。

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
  int n,m,sum=0;
  int max=-1000001;
  int maxsecond=-1000001,maxdu=0;
  cin>> n>>m;
  int a[10][10];
  for (int i=1; i<n; i++) 
  {
    for (int j=1; j<m; j++)
    {
      cin>>a[i][j];
    }
  }

  for(int i=1; i<=n; i++)
  {
    for(int j=1; j<=m; j++)
    {

      if(a[i][j]>max)
      {
        maxsecond=max;
      max=a[i][j];
      }
      else if (a[i][j]>maxsecond)
      {
        maxsecond=a[i][j];
      }

    }
  }
    cout<<endl;
cout<<max<<" "<<maxsecond;
}

输入:

2 3
4 8 5
2 1 7 

我应该得到的输出:

8 7

我现在得到的输出:

8 4

3 个答案:

答案 0 :(得分:0)

撇开注释中指出的问题,您的代码在输入行中缺少等号,因此不会在所有用户输入中读取该代码。例如,该代码仅从示例输入中读取两个数字。如下所示在比较运算符中添加等号即可解决该问题:

for (int i=1; i<=n; i++)
{
    for (int j=1; j<=m; j++)
    {
      cin >> a[i][j];
    }
}

答案 1 :(得分:0)

首先:您扫描的输入错误。您正在尝试将(int i=1; i<n; i++)(int j=1; j<m; j++)范围的输入读入2D数组,并从1开始直到<n都在读n-1元素。您进行比较的代码是正确的,但是索引的方式是错误的。

您只需将读取和比较的索引都修改为(int i=0; i<n; i++)(int j=0; j<m; j++),就可以解决此问题。

第二:您的主要功能是“ int main()”,但您忘了在末尾添加“ return 0

建议:由于您要从用户那里获取2D数组(矩阵)的大小,因此我建议为此使用STL向量。您可以在输入后调整向量的大小。这是一个例子

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<vector<int> >a;
    int max=-1000001;
    int maxsecond=-1000001,maxdu=0;
    int n,m;
    cin>>n>>m;

    a.resize(n,vector<int>(m,0)); //Creates n x m matrix

    for (int i=0; i<n; i++) 
    {
        for (int j=0; j<m; j++)
        {
          cin>>a[i][j];
        }
    }

    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {

          if(a[i][j]>max)
          {
            maxsecond=max;
            max=a[i][j];
          }
          else if (a[i][j]>maxsecond)
          {
            maxsecond=a[i][j];
          }

        }
    }
    cout<<"\nMax: "<<max;
    cout<<"\nSecond Max: "<<maxsecond;

    return 0;
}

答案 2 :(得分:0)

在此代码块中,如果您观察到,该代码块用于输入2D数组

for (int i = 1; i < n; i++)
{
  for (int j = 1; j < m; j++)
  {
    cin >> a[i][j];
  }
}

您仅分别输入位置1到n-1和m-1的元素。 因此,如果您输入的是2 3 然后

a[1][1] ->> 4 a[1][2] ->> 8

由于条件变为假,输入将停止。 然后,在其余的代码之后执行相同的代码,结果分别为8和4;

在C ++数组中,格式从0n-1。假设数组arr [5],我们可以访问a [0],a [1],a [2],a [3],a [4]。 因此,我们编写循环以将数组迭代为 for ( int i = 0; i < arr_size; i++ )

请找到更正的解决方案以供参考。

#include <iostream>
#include <limits>
int main()
{
    int arr[10][10];
    int size1 = 0, size2 = 0;
    std::cin >> size1 >> size2;

    for (size_t i = 0; i < size1; i++)
    {
        for (size_t j = 0; j < size2; j++)
        {
            std::cin >> arr[i][j];
        }
    }

    int max, secondMax;
    max = secondMax = std::numeric_limits<int>::min();

    for (size_t i = 0; i < size1; i++)
    {
        for (size_t j = 0; j < size2; j++)
        {
            if (arr[i][j] > max)
            {
                secondMax = max;
                max = arr[i][j];
            }
            else if (arr[i][j] > secondMax)
            {
                secondMax = arr[i][j];
            }

        }
    }
    std::cout << max << " " << secondMax << std::endl;
    return 0;
}