例如:
array[] = {3, 9, 10, **12**,1,4,**7**,2,**6**,***5***}
首先,我需要最大值= 12然后我需要在数组的其余部分(1,4,7,2,6,5)中获得最大值,所以value = 7,然后是数组6其余部分的maxiumum值,然后5,之后,我将需要一系列这个值。这回馈(12,7,6,5)。
如何获得这些数字? 我尝试了以下代码,但似乎无限 我想我需要一个递归函数但是我该怎么做呢?
max=0; max2=0;...
for(i=0; i<array_length; i++){
if (matrix[i] >= max)
max=matrix[i];
else {
for (j=i; j<array_length; j++){
if (matrix[j] >= max2)
max2=matrix[j];
else{
...
...for if else for if else
...??
}
}
}
}
答案 0 :(得分:5)
这是使用std::max_element()
标准算法在C ++ 11中执行此操作的方法:
#include <vector>
#include <algorithm>
#include <iostream>
int main()
{
int arr[] = {3,5,4,12,1,4,7,2,6,5};
auto m = std::begin(arr);
while (m != std::end(arr))
{
m = std::max_element(m, std::end(arr));
std::cout << *(m++) << std::endl;
}
}
这是live example。
答案 1 :(得分:2)
这是使用Cartesian tree数据结构的绝佳位置。笛卡尔树是一系列具有这些属性的元素构建的数据结构:
例如,给定序列
4 1 0 3 2
笛卡尔树将是
4
\
3
/ \
1 2
\
0
请注意,这遵循堆属性,并且inorder walk会返回序列4 1 0 3 2
,这是原始序列。
但这是关键观察:请注意,如果你从这棵笛卡尔树的根开始并开始向右走,你会得到数字4(序列中最大的元素),然后是3(最大的元素)在4)之后发生的事情,以及数字2(3之后的最大元素)。更一般地说,如果你为序列创建一个笛卡尔树,那么从根开始并继续向右走,你将得到你正在寻找的元素序列!
这样的美妙之处在于笛卡尔树可以constructed in time Θ(n),这是非常快的,沿着脊柱行走只需要时间O(n)。因此,找到您正在寻找的序列所需的总时间是Θ(n)。注意“找到最大元素,然后找到之后出现的子阵列中的最大元素,等等”的方法。如果输入按降序排序,则在最坏的情况下会在时间Θ(n 2 )中运行,所以这个解决方案要快得多。
希望这有帮助!
答案 2 :(得分:0)
如果您可以修改数组,您的代码将变得更简单。每当您找到max时,输出该值并将其在原始数组中的值更改为某个较小的数字,例如-MAXINT。输出数组中的元素数后,就可以停止迭代了。
答案 3 :(得分:0)
std::vector<int> output;
for (auto i : array)
{
auto pos = std::find_if(output.rbegin(), output.rend(), [i](int n) { return n > i; }).base();
output.erase(pos,output.end());
output.push_back(i);
}
希望您能理解该代码。我在用C ++编写算法比用英语编写算法要好得多,但这是一次尝试。
在我们开始扫描之前,output
为空。这是空输入的正确状态。
我们首先查看输入数组中第一个未查看的元素 I
。我们向后扫描输出,直到找到 G
元素,该元素大于 I
。然后我们从 G
之后的位置开始删除。如果我们找不到,那就意味着 I
是我们搜索到的元素的最大元素,因此我们会删除整个output
。否则,我们会删除 G
之后的所有元素,因为 I
从 G
开始是最好的通过我们迄今为止搜索过的内容。然后我们将 I
附加到output
。重复直到输入数组耗尽。