数组的2个最小数字

时间:2015-05-24 13:02:42

标签: c++ arrays

问题很简单(答案很可能): 如何找到阵列的2个最小数字?

  for ( i = 1; i <= n ; i++){
        if(v[i] < maxim)
        maxim = v[i];
                            }
  cout << maxim;

这是我唯一想到的东西,但它只显示最低数字,而不是最低数字2

6 个答案:

答案 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_heapk)循环遍历数组,以跟踪最低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());