我将如何通过分而治之来寻找ArrayList中的两个最大元素

时间:2015-03-12 03:54:18

标签: java recursion divide-and-conquer

我有很多想法如何递归地通过分而治之来做到这一点。我以为我早就有了它,但那时我尝试使用的东西不起作用。我有一个通过O(n)执行它的代码,但它不起作用,因为它不适用于分而治之。这是O(n)的代码:

 public void find(ArrayList<Integer> list){
    int first = 0;
    int second = 0;
    for(int n:list){
        if(first < n){
           second = first;
           first = n;
        } else if(second < n){
            second = n;
        }
    }

我尝试在快速排序之后对此进行建模,但后来发现它在[4,3,6]这样的情况下不会起作用,只需在三个旋转后选择6并立即消除4,即使它是第二大元素。

我只是需要帮助才能做到这一点,我不需要有人发布所有代码。我想尝试自己弄清楚,但是我仍然很难理解如何完成这项工作。

1 个答案:

答案 0 :(得分:0)

这是我前一段时间写的关于递归的内容,它应该可以让你开始:


递归方法的工作原理是每次调用方法时将较大的问题分解为较小的问题。这可以让你打破困难的问题;一个因子总和,成为一系列较小的问题。

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

if (num == 1)
  return 0;

2)一般情况:一般情况是在我们达到基本情况之前我们要打电话的情况。 我们再次调用该函数,但这次使用的函数比上一个函数(搜索索引,值等)少1。这使我们能够走向基本案例。

return = num + factorial( num - 1);

这个语句意味着我们首先调用的函数比函数的函数少1;我们从三个开始,下一个调用从两个开始,之后的调用以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的结果!