递归最小化两个塔之间的最大差异

时间:2020-06-28 14:53:31

标签: java recursion

给出n个塔的高度和值k。我们需要将每个塔的高度增加或减少k(仅一次),其中k>0。任务是最小化修改后最长和最短塔的高度之间的差异,并输出该差异。

输入{1、5、15、10}

K = 3

输出为8

输入{1,10,14,14,14,14,15}

K = 6

输出为5

我意识到这可以通过DP技术/ Greedy技术解决。谁能通过递归帮助我解决此问题。下面是一个示例代码片段。谢谢您的答复。

public class TowerHeights {
    public static void main(String[] args) {
        int[] towerHeight = {1,5,15,10};
        int k = 3;
        Arrays.sort(towerHeight);
        int min = towerHeight[0] + k;
        int max = towerHeight[towerHeight.length-1] - k;
        minimize(towerHeight,1,k,min,max);
    }

    public static void minimize(int[] towerHeight, int index, int k, int min, int max){
        if(index<=towerHeight.length-2){

            //I need help in completing this function recursively
        }
    }
}

问题参考: https://www.geeksforgeeks.org/minimize-the-maximum-difference-between-the-heights/

1 个答案:

答案 0 :(得分:1)

我认为对于DP或贪婪的子问题这不是问题。要递归求解,请尝试这种方式,例如使用递归进行循环

public static int minimize(int[] towerHeight, int index, int k, int min, int max){
    if(index<=towerHeight.length-2){
        int subtract = towerHeight[index] - k; 
        int add = towerHeight[index] + k; 
        if (!(subtract >= min || add <= max)){
             if (max - subtract <= add - min) min = subtract; 
             else max = add;
        }
        return Math.min(minimize(towerHeight,index+1,k,min,max), max - min);
    }
    else {
        return max-min;
    }
}