【问题标题】:Find second largest element in an array using recursion使用递归查找数组中的第二大元素
【发布时间】:2012-12-25 01:26:42
【问题描述】:

正如标题所说,有没有什么有效的方法可以使用递归找到数组中的第二大元素?

【问题讨论】:

  • 向我们展示您的代码,我们会告诉您它是否有效
  • 你必须使用递归吗?没有它很容易做到。
  • 效率和递归是两个不同的方向。
  • 假设它是未排序的,最简单的方法是遍历数组一次,找到最大的元素,然后再次遍历找到小于最大元素的最大元素。你可以使用递归;它会递归两次。
  • @iamnotmaynard 既然可以通过一次,为什么还要通过两次?

标签: algorithm sorting data-structures recursion


【解决方案1】:

如果对数组一无所知,无论是递归还是迭代,你都不能比O(n) 做得更好。

只需递归地传递数组,同时传递两个最大的元素并在找到更大的值时替换它们。

find_largest(array_begin, largest, secondLargest)
    if (array_begin = NULL)
       return secondLargest
    if (array_begin.value > largest)
       secondLargest = largest
       largest = array_begin.value
    return find_largest(array_begin+1, largest, secondLargest)

largestsecondLargest 最初可以设置为您希望在数组中找到的最小值。

你说得对,排序(至少是完全排序)太过分了。

【讨论】:

  • 如果对数组一无所知,如何设置最小值?你是说第一个元素吗?
  • @Neel 我的意思是没有其他信息 - 即,如果您知道数组已排序,您可以在 O(1) 中进行。
【解决方案2】:

partition based Selection algorithm 本质上是递归的,它可以让您选择数组中的第 k'th 元素,因此使用它 - 您实际上可以找到任何 k 的答案,包括k = n-1(你的情况)。

这是在O(n) 中完成的,平均常数相当低。

【讨论】:

    【解决方案3】:

    O(n) 中的内容如下:

    int findSecondLargest(int[] arr, int index, int largest, int secondLargest) {
        if(index == arr.length) {
            return secondLargest;
        }
        int element = arr[index];
        if(element > secondLargest) {
            if(element > largest) {
                return findSecondLargest(arr, index + 1, element, largest);
            } else {
                return findSecondLargest(arr, index + 1, largest, element);
            }
        }
        return findSecondLargest(arr, index + 1, largest, secondLargest);
    }
    

    【讨论】:

      【解决方案4】:
          public void recurs(int[] data, int ind, int max1, int max2){
              if(ind<data.length){
                  if(data[ind]>max1){
                      int temp = max1;
                      max1 = data[ind];
                      max2 = temp;
                  } else if(data[ind]>max2){
                      max2 = data[ind];
                  }
                  recurs(data, ind+1, max1, max2);
              } else {
                  return max2;
              }
              return -1;
          }
      

      调用它: recurs(dataX, 0, Integer.MIN_VALUE, Integer.MIN_VALUE);

      【讨论】:

        【解决方案5】:

        本能地,您可以扫描数组并对每个值进行两次比较。无论如何,你需要 O(n) 来解决这个问题。它足够快。

        在不必要的时候尽量避免递归,因为它不是免费的。

        【讨论】:

          【解决方案6】:

          如果您通过递归进行,那么您最多需要进行 3(n)/2-2 次比较,但为了获得更好的解决方案,请将此问题视为具有 n 个节点的二叉树。然后将进行 n-1 比较以找到最大的和 log(n)-1 比较以找到第二大的。但有些人认为它需要 n + log(n) 比较。

          【讨论】:

            猜你喜欢
            • 2018-11-18
            • 1970-01-01
            • 2021-06-08
            • 2016-03-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-26
            • 1970-01-01
            相关资源
            最近更新 更多