【问题标题】:Java - Recursion to find the 2 smallest nums in arrayJava - 递归查找数组中的 2 个最小的数字
【发布时间】:2018-01-10 17:00:58
【问题描述】:

所以我遇到了在数组中找到 2 个最小数字的问题,但我必须使用递归(递归部分是本练习的一部分)。 我开始思考如何去做,我试图做的“计划”是这样的,首先找到数组中最小的,然后标记我找到它的位置,然后将数组分成两组并搜索这 2 组可能会从他们那里得到最小的..

这是我到目前为止得到的代码:

public static int MinRecu2(int[] a) {
    if (a.length == 1)
        return a[0];
    int min = a[0];
    int min2;
    int mark = 0;

    // Find first min
    for (int i = 1; i < a.length; i++) {
        if (a[i] < min) {
            min = a[i];
            mark = i;
        }
    }

    int [] help1= new int [mark+1];
    int [] help2= new int [a.length-mark];
    help1=Arrays.copyOfRange(a, 0, mark);
    help2=Arrays.copyOfRange(a, mark+1, a.length-1);

    // Find second min
    min2 = Math.min(MinRecu2(help1), MinRecu2(help2));

    return min;
}

我知道代码不起作用,并且我试图做的“递归”很糟糕,但是我试图让我的想法变成代码

【问题讨论】:

  • 你在哪里尝试实现递归?
  • 尝试使用 java.util.Arrays.sort(int[]) 对数组进行排序
  • @rjdkolb:这是一项学术作业,我猜你的建议是不允许的。
  • @HovercraftFullOfEels 我的错..我没有更改函数名称,现在看

标签: java arrays algorithm recursion


【解决方案1】:

这是解决您问题的一种方法。

public static int[] twoSmallest(int[] arr, int s, int e) {
    int[] list;
    if (e - s <= 3) { // maybe 2 or 3
        list = new int[e - s];
        for (int i = s; i < e; i++)
            list[i - s] = arr[i];
    } else {
        int[] left = twoSmallest(arr, s, (s + e) / 2);
        int[] right = twoSmallest(arr, (s + e) / 2, e);
        list = new int[4];
        list[0] = left[0];
        list[1] = left[1];
        list[2] = right[0];
        list[3] = right[1];
    }
    Arrays.sort(list);
    return new int[] {list[0], list[1]};
}

这个函数的意思是在[s, e)中找到arr中的两个最小的数。你可以这样调用:

int[] result = twoSmallest(arr, 0, arr.length);

【讨论】:

  • 谢谢,我现在看看,看看我哪里做错了
【解决方案2】:
private static int findMinFromArray(int[] iArray, int index, int min) {
    if(index <= (iArray.length - 1)){
        if(iArray[index] < min){
            min = iArray[index];
        }
        System.out.println("Before: " + "Index = " + index + " | Min = " + min);
        findMinFromArray(iArray, index + 1, min);
    }
    System.out.println("After: " + "Index = " + index + " | Min = " + min);
    return min;
}

我不知道如何让程序停止,而不是像现在这样重新返回。这只找到最小的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2016-05-07
    相关资源
    最近更新 更多