查找数组其余部分的最大值
Finding maximum values of rests of array
例如:
array[] = {3, 9, 10, **12**,1,4,**7**,2,**6**,***5***}
首先,我需要最大值=12,然后我需要数组其余部分(1,4,7,2,6,5(中的最大值,所以值=7,然后数组6其余部分的最大值,然后是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
...??
}
}
}
}
您在 C++11 中使用 std::max_element()
标准算法执行此操作的方式:
#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;
}
}
这是一个活生生的例子。
这是使用笛卡尔树数据结构的绝佳位置。 笛卡尔树是由具有以下属性的一系列元素构建的数据结构:
- 笛卡尔树是一棵二叉树。 笛卡尔树
- 服从堆属性:笛卡尔树中的每个节点都大于或等于其所有后代。
- 笛卡尔树的无序遍历返回原始序列。
例如,给定序列
4 1 0 3 2
笛卡尔树将是
4
3
/
1 2
0
请注意,这服从堆属性,并且无序遍历返回序列4 1 0 3 2
,这是原始序列。
但这里有一个关键的观察结果:请注意,如果你从这棵笛卡尔树的根部开始,然后开始向右走,你会得到数字4(序列中最大的元素(,然后是3(4之后最大的元素(和数字2(3之后的最大元素(。 更一般地说,如果你为序列创建一个笛卡尔树,然后从根开始,继续向右走,你会得到你正在寻找的元素序列!
这样做的美妙之处在于,笛卡尔树可以在时间Θ(n(中构建,这是非常快的,沿着脊柱走只需要O(n(的时间。 因此,找到您要查找的序列所需的总时间为 Θ(n(。 请注意,如果输入按降序排序,则在最坏的情况下,"找到最大的元素,然后找到子数组中出现的最大元素,等等"的方法将在时间 Θ(n2( 上运行,因此此解决方案要快得多。
希望这有帮助!
如果你可以修改数组,你的代码将变得更加简单。 每当找到 max 时,输出该值并将其在原始数组中的值更改为一些小数字,例如 -MAXINT。 输出数组中的元素数后,可以停止迭代。
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
。 我们向后扫描输出,直到找到大于 I
的元素G
。然后我们从G
之后的位置开始擦除。 如果我们没有找到,这意味着I
是迄今为止我们搜索过的元素中最大的元素,因此我们擦除了整个output
。 否则,我们会在G
之后擦除每个元素,因为从 G
到我们迄今为止搜索的内容I
是最伟大的。 然后我们将I
附加到output
. 重复直到输入数组耗尽。
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 使用指针从C++中的数组中获取最大值
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 在二维数组中查找最小值和最大值?
- 整数溢出,最大值为 pow(10,19)
- 以C++递归方式查找向量中的最大值
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 我的 If Else 语句无法在向量 (C++) 中提供最大值
- 如何使用可变参数模板类使用模板元编程获得最大值
- C++不同的最小最大值实现
- Vec3b:r/g/b 颜色的最大值为 254,而不是 255
- CUDA - 将 float3 数组的 (x,y,z) 分量的最小值/最大值分开?
- 是否可以将无符号 int 的最大值转换为 int 并将结果转换为 -1?
- 查找包含 N 个元素的数组的最小值和最大值
- 井字游戏具有奇怪行为的最小最大值算法(C++)
- 错误C++在Visual Studio 2019中使用numeric_limits的长双精度最小值/最大值
- 是否存在用于 C 或 C++ 中常见数学运算(例如最小值、最大值和平均值)的可导入库?