Java 我如何通过分而治之找到ArrayList中最大的两个元素

Java 我如何通过分而治之找到ArrayList中最大的两个元素,java,recursion,divide-and-conquer,Java,Recursion,Divide And Conquer,我一直在想如何通过分而治之的方法递归地完成这项工作。我以为我有一段时间前,但后来我试图使用的没有工作。我有一个通过O(n)实现的代码,但它不起作用,因为它不适用于分而治之。这是O(n)的代码: 公共作废查找(ArrayList列表){ int first=0; int秒=0; for(int n:list){ 如果(第一个

我一直在想如何通过分而治之的方法递归地完成这项工作。我以为我有一段时间前,但后来我试图使用的没有工作。我有一个通过O(n)实现的代码,但它不起作用,因为它不适用于分而治之。这是O(n)的代码:

公共作废查找(ArrayList列表){
int first=0;
int秒=0;
for(int n:list){
如果(第一个
我尝试在快速排序后对此进行建模,但后来发现它在
[4,3,6]
这样的情况下不起作用,它只会在三个元素上旋转后选择6,并立即消除4,即使它是第二大元素


我只需要帮助就可以做到这一点,我不需要有人发布所有的代码。我想自己尝试并解决它,但我在理解如何完成这一点上仍然有很多困难。

这是我不久前写的关于递归的文章,应该可以让您开始:


递归方法的工作原理是每次调用该方法时将一个较大的问题分解为较小的问题。这允许您将一个困难的问题(阶乘求和)分解为一系列较小的问题

每个递归函数有两个部分:
1) 基本情况:我们关心评估的最低值。通常为零或一

if (num == 1)
  return 0;
2) 一般情况:在到达基本情况之前,我们将调用一般情况。我们再次调用该函数,但这次使用的函数比之前开始的函数(搜索索引、值等)少1个。这允许我们朝着基本情况努力

return = num + factorial( num - 1);
这句话的意思是,我们将首先用比这个函数少1的值调用这个函数;我们从3开始,下一个调用从2开始,之后的调用从1开始(这会触发我们的基本情况!)

一旦达到我们的基本情况,这些方法就会“递归出来”。这意味着它们会向后反弹,返回到调用它的函数中,从它下面的函数中获取所有数据! 正是在这一点上,我们的求和实际上发生了

一旦达到原始函数,我们就有了最终的求和

例如,假设您需要前3个整数的总和,第一个递归调用传递数字3

  public static int factorial (int num) {
     //Base case
     if (num == 1) {
        return 1;
     }
  //General case
  return num * factorial(num-1);

  }
浏览函数调用:

factorial(3); //Initial function call
//变成

factorial(1) * factorial(2) * factorial(3) = returned value

这给了我们一个6的结果!

用英语怎么说:一个元素数组的arrayMax()就是那一个元素。对于较大的数组,找到数组前半部分的arrayMax()(直到中间索引)和数组后半部分的arrayMax()(从中间索引开始)以这些数字的最大值为例。是的,我想我应该从简单的东西开始,不幸的是,当涉及到递归时,我的知识差距很大。递归不是一个微不足道的概念。它有时很难理解,甚至更难掌握。
factorial(1) * factorial(2) * factorial(3) = returned value