我正在尝试解决此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;
}
结果是预期的(至少对于我所做的测试而言),但是网站说错了。
答案 0 :(得分:1)
您应该在代码中进行一些更改:
使用std::vector<int>
而不是可变长度数组(VLA):
原因:
std::vector
是标准的C ++。std::vector
从堆而不是堆栈中获取内存。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)的每个值。
希望这会有所帮助。