Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找数组其余部分的最大值_C++_Arrays_Recursion_Max_Dynamic Arrays - Fatal编程技术网

C++ 查找数组其余部分的最大值

C++ 查找数组其余部分的最大值,c++,arrays,recursion,max,dynamic-arrays,C++,Arrays,Recursion,Max,Dynamic Arrays,例如: 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_len

例如:

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
                         ...??
                      }
                  }
             }
         }

如果可以修改数组,代码将变得更简单。无论何时,只要找到一个max,就输出它,并将其在原始数组中的值更改为一个较小的数字,例如-MAXINT。一旦输出了数组中的元素数,就可以停止迭代。

如果可以修改数组,代码将变得更简单。无论何时,只要找到一个max,就输出它,并将其在原始数组中的值更改为一个较小的数字,例如-MAXINT。一旦输出了数组中的元素数,就可以停止迭代。

这是在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;
    }
}

下面是一个。

这是在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;
    }
}

这是一个。

这是一个使用数据结构的好地方。笛卡尔树是由具有以下属性的元素序列构成的数据结构:

笛卡尔树是一种二叉树。 笛卡尔树遵从heap属性:笛卡尔树中的每个节点都大于或等于其所有子节点。 笛卡尔树的无序遍历返回原始序列。 例如,给定序列

4  1  0  3  2
笛卡尔树将是

   4
    \
     3
    / \
   1   2
    \
     0
请注意,这符合heap属性,按顺序遍历返回序列4 1 0 3 2,这是原始序列

但这里有一个关键的观察结果:请注意,如果你从笛卡尔树的根开始向右走,你会得到数字4,序列中最大的元素,然后是3,在4之后是最大的元素,数字2,在3之后是最大的元素。更一般地说,如果你为序列创建一个笛卡尔树,然后从根开始一直向右走,你会得到你正在寻找的元素序列

这样做的美妙之处在于笛卡尔坐标树可以移动,速度非常快,沿着脊柱走下去只需要一段时间。因此,找到您要查找的序列所需的总时间为Θn。请注意,如果输入按降序排序,则查找最大元素,然后在随后出现的子阵列中查找最大元素等的方法在最坏的情况下将在时间Θn2中运行,因此此解决方案的速度要快得多


希望这有帮助

这是使用数据结构的绝佳地点。笛卡尔树是由具有以下属性的元素序列构成的数据结构:

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);
}
笛卡尔树是一种二叉树。 笛卡尔树遵从heap属性:笛卡尔树中的每个节点都大于或等于其所有子节点。 笛卡尔树的无序遍历返回原始序列。 例如,给定序列

4  1  0  3  2
笛卡尔树将是

   4
    \
     3
    / \
   1   2
    \
     0
请注意,这符合heap属性,按顺序遍历返回序列4 1 0 3 2,这是原始序列

但这里有一个关键的观察结果:请注意,如果你从笛卡尔树的根开始向右走,你会得到数字4,序列中最大的元素,然后是3,在4之后是最大的元素,数字2,在3之后是最大的元素。更一般地说,如果你为序列创建一个笛卡尔树,然后从根开始一直向右走,你会得到你正在寻找的元素序列

这样做的美妙之处在于笛卡尔坐标树可以移动,速度非常快,沿着脊柱走下去只需要一段时间。因此,找到您要查找的序列所需的总时间为Θn。请注意,如果输入按降序排序,则查找最大元素,然后在随后出现的子阵列中查找最大元素等的方法在最坏的情况下将在时间Θn2中运行,因此此解决方案的速度要快得多

希望这有帮助

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++中比用英语描述算法要好得多,但这里有一个尝试。

在开始扫描之前,输出为空。这是空输入的正确状态

我们首先查看输入数组中第一个未调用的元素I。我们向后扫描输出,直到我们找到一个大于I的元素G。然后我们从G之后的位置开始擦除。如果我们没有找到,这意味着I是迄今为止我们搜索的元素中最大的元素,所以我们擦除 整个输出。否则,我们会删除G之后的每个元素,因为从G开始到目前为止,我是最伟大的。然后我们将I附加到输出。重复此操作,直到输入数组耗尽

希望您能够理解该代码。我在编写C++中比用英语描述算法要好得多,但这里有一个尝试。

在开始扫描之前,输出为空。这是空输入的正确状态


我们首先查看输入数组中第一个未调用的元素I。我们向后扫描输出,直到我们找到一个大于I的元素G。然后我们从G之后的位置开始擦除。如果我们没有找到,这意味着I是迄今为止我们搜索的元素中最大的元素,所以我们擦除整个输出。否则,我们会删除G之后的每个元素,因为从G开始到目前为止,我是最伟大的。然后我们将I附加到输出。重复此操作,直到输入数组用尽。

您可以使用标准库中的算法吗?@yngum-OP特别想要数组中第一个最大值之后的最大值。前四个值可能都在数组中最大值之前。@templatetypedef:实际上不可能,因为最大值是前四个值中的一个,因此它不能在其自身之前。但除了技术上的问题……:p您可以使用标准库中的算法吗?@yngum-OP特别想要数组中第一个最大值之后的最大值。前四个值可能都在数组中最大值之前。@templatetypedef:实际上不可能,因为最大值是前四个值中的一个,因此它不能在其自身之前。但除了技术上的问题……:我道歉,你是对的。我道歉!但是,在给定降序的最坏情况下,它会在^2上及时运行,这对于大的输入是不好的。@templatetypedef:抱歉,删除了前面的注释,您的复杂性是正确的。不过,在我看来,这个算法简单易懂,所以除非证明最坏情况的复杂性是一个问题,否则它是一个很好的选择。对不起,你是对的。我道歉!但是,在给定降序的最坏情况下,它会在^2上及时运行,这对于大的输入是不好的。@templatetypedef:抱歉,删除了前面的注释,您的复杂性是正确的。不过,在我看来,这个算法简单易懂,所以除非证明最坏情况的复杂性是一个问题,否则它是一个很好的被选择的候选者。你基本上描述了一个不合适的选择排序,而不是OP想要的。你基本上描述了一个不合适的选择排序,完全不是OP想要的。看起来不错,但我不知道数据结构和对象。实际上,我的目标是根据视点来展示建筑物的轮廓。使用指针并在运行时动态分配内存。使用适当的指针算法访问建筑物。不要使用数组和数组索引。所以,没有对象或数据结构,一切都正常,直到写下建筑物的高度,我无法使算法看起来很好,但我不知道数据结构和对象。实际上,我的目标是根据视点来展示建筑物的轮廓。使用指针并在运行时动态分配内存。使用适当的指针算法访问建筑物。不要使用数组和数组索引。所以,没有对象或数据结构,一切都正常,直到写下建筑物的高度,我无法生成算法