问题很简单(答案很可能): 如何找到阵列的2个最小数字?
for ( i = 1; i <= n ; i++){
if(v[i] < maxim)
maxim = v[i];
}
cout << maxim;
这是我唯一想到的东西,但它只显示最低数字,而不是最低数字2
答案 0 :(得分:4)
如果您的阵列可能已更改,则可以使用std::partial_sort
:
std::partial_sort(v, v+2, v+n);
然后,v[0]
和v[1]
是v
的两个最小值。
如果无意更改阵列,或者应该避免,std::partial_sort_copy
是您的朋友。引入一个包含最小值的两个元素的新数组:
int minima[2];
std::partial_sort_copy(v, v+n, minima, minima+2);
(请相应更改数组minima
的类型。我不知道数组v
的类型。)
要使这些功能可用,您必须包含以下文件:
#include <algorithm>
答案 1 :(得分:3)
另一种简单的方法是......
int v[] = {33,11,22,3};
int secmaxim = INT_MAX-1;
int maxim = INT_MAX;
for ( int i = 0; i < 4 ; i++){
if(v[i] < maxim)
{
secmaxim = maxim;
maxim = v[i];
}
else if(v[i] < secmaxim && v[i] != maxim)
secmaxim = v[i];
}
cout << maxim << secmaxim;
答案 2 :(得分:2)
如何在C ++中找到数组的k
个最小元素。
天真的方法:致电std::sort
;看看第一个k
元素。运行时间O(n log n)。
采访问题方法:使用带有std::set
元素的std::push_heap
(或pop_heap
和k
)循环遍历数组,以跟踪最低k
。运行时间O(n log k)。也不修改数组,按顺序返回结果,只使用O(k)额外空格。
最佳方法:#include <algorithm>
。 std::nth_element(&a[0], &a[k], &a[n])
。查看第一个k
元素。运行时间O(n),这是最佳的。
[更新]
我觉得我应该通过“面试问题方法”来解释我的意思。如果你在接受采访时被问到这个问题,你可能在Google或亚马逊或其他一些大数据yadda-yadda环境中,并且采访者说过“我在磁盘上有1000亿个整数,我想知道最小的1000个。“在这种情况下,修改数组或需要额外空间O(n)的解决方案可能不是最佳选择。
答案 3 :(得分:0)
您可以使用std :: sort()对元素进行排序
这是一个显示排序如何工作的小例子?
#include <iostream>
#include <array>
#include <algorithm>
int main() {
std::array<int, 5> arr {5,3,24,9,7};
std::sort(arr.begin(), arr.end());
std::cout << arr[0] << std::endl << arr[1];
return 0;
}
在上面的代码中,std::sort
将按升序对数组arr
进行排序。使用<algorithm>
时需要sort
标题。
输出为
3
5
Here是指向上述代码的工作版本的链接。
答案 4 :(得分:0)
不改变数组的顺序,
#include <iostream>
#include <vector>
#include <algorithm>
int main( )
{
std::vector<int> v {9, 8, 7, 6, 5, 1, 2, 3, 4};
int smallest = *std::min_element(v.begin(), v.end());
int second_smallest = *std::min_element(v.begin(), v.end(), [&smallest](int i, int j) { return i < j && i >= smallest; });
std::cout << "smallest: " << smallest << std::endl;
std::cout << "second smallest: " << second_smallest << std::endl;
}
输出
smallest: 1
second smallest: 2
答案 5 :(得分:-1)
改编自@leemes答案(使用更现代的语法),请参阅他的答案以获得解释。
const auto topVals = 2;
std::array<int, topVals> minima;
std::partial_sort_copy(std::begin(v), std::end(v), minima.begin(), minima.end());