给出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/
答案 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;
}
}