在 Java 中的整数数组列表中查找最小值的递归函数

问题描述

这是我在自学java的过程中一直在思考的一个问题。该问题包括编写一个递归函数,该函数在整数 ArrayList 中找到最小值。下面你会发现我的尝试。我相信它按预期工作,但我想知道是否有更好的方法来完成这项工作。任何意见表示赞赏。

public static int findMin(ArrayList<Integer> numbers){
        // Base Case
        if(numbers.size()==1){
            return numbers.get(0).intValue();
        }
    
  
        ArrayList<Integer> numbers_short = new ArrayList<Integer>(numbers);
        numbers.remove(numbers.size()-1);

        return Math.min(numbers_short.get(numbers_short.size()-1).intValue(),findMin(numbers));
    }

解决方法

你的例子不太好,在这种情况下你不应该使用递归。 但无论如何,您可以避免每次都复制您的数组,方法是使用带有开始和结束参数的方法来仅分析初始数组的一部分。

类似的东西:


    public static int findMin(ArrayList<Integer> numbers) {
        return findMin(numbers,numbers.size() - 1);
    }

    public static int findMin(ArrayList<Integer> numbers,int start,int end) {
        if (end == start)
            return numbers.get(start);
        int middle = start + (end - start) / 2;
        return Math.min(findMin(numbers,start,middle),findMin(numbers,middle + 1,end));
    }

并在需要时添加检查以防数组为空。

我使用“中间”方法的原因是每次将数组除以 2,这意味着在最后它限制了堆栈溢出的风险,因为它会将递归的最大数量除以 2在每个元素上递归。

,

您可能希望避免每次调用该方法时都创建一个新的 ArrayList 对象。对于较小的输入,这似乎无关紧要,但对于非常大的输入,它可能会导致 StackOverflowError

具有相似时间复杂度的更简洁的解决方案可以是:

public static int findMin(ArrayList<Integer> numbers) {
        return findMin(numbers,numbers.size());
    }

public static int findMin(ArrayList<Integer> numbers,int len) {
    // Base Case
    if (len == 1) {
        return numbers.get(0);
    }
    
    return Math.min(numbers.get(len-1),len-1));
}

对垃圾收集器和递归的引用:Garbage Collection in Java with Recursive Function