如何找到数组的最小值?

时间:2019-07-18 07:28:29

标签: c++ arrays

我正在尝试解决此question 但是codechef.com说答案是错误的。

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

int main()
{
    int t, n, diff, mindiff;
    cin >> t;
    cin >> n;
    int val[n];

    while(t--)
    {
        mindiff = 1000000000;
        for(int i = 0; i<n; i++)
        {
            cin >> val[i];
        }
        int a = 0;
        for(a = 0; a<n ; a++)
        {
            for(int b=a+1; b<n ; b++)
            {
                diff = abs(val[a] - val[b]);
                if(diff <= mindiff)
                {
                    mindiff = diff;
                }
            }
        }
        cout << mindiff << endl;
    }
    return 0;
}

结果是预期的(至少对于我所做的测试而言),但是网站说错了。

2 个答案:

答案 0 :(得分:1)

您应该在代码中进行一些更改:

使用std::vector<int>而不是可变长度数组(VLA)

原因:

  1. 可变长度数组不是标准的C ++。 std::vector是标准的C ++。
  2. 如果条目数很大,可变长度数组可能会耗尽堆栈内存。 std::vector从堆而不是堆栈中获取内存。
  3. 可变长度数组遭受与常规数组相同的问题-超出数组范围会导致未定义 行为。 std::array具有at()函数,可以在需要时检查边界访问。

使用最大值int来获取最大值。

代替

mindif = 1000000000;

应该是:

   #include <climits>
   //...
   int mindiff = std::numeric_limits<int>::max();

对于您选择的解决方案,应解决主体部分中有关嵌套循环的注释。

您应该首先对数据进行排序,而不是嵌套的for循环。因此,找到两个值之间的最小值要容易得多,并且时间复杂度更低。

程序可以看起来像这样(使用链接中提供的数据):

#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>

int main()
{
   int n = 5;
   std::vector<int> val = {4, 9, 1, 32, 13};
   int mindiff = std::numeric_limits<int>::max();
   std::sort(val.begin(), val.end());
   for(int a = 0; a < n-1 ; a++)
       mindiff = std::min(val[a+1] - val[a], mindiff);
   std::cout << mindiff;           
}

输出:

3

答案 1 :(得分:0)

为此,您可以使用简单的for():

// you already have an array called "arr" which contains some numbers.
int biggestNumber = 0;
for (int i = 0; i < arr.size(); i++) {
    if (arr[i] > biggestNumber) {
        biggestNumber = arr[i];
    }
}

arr.size将获取数组的长度,以便您可以检查从位置0到最后一个值arr.size()-1(因为数组在c ++中基于0)的每个值。

希望这会有所帮助。