【发布时间】:2019-02-08 12:45:37
【问题描述】:
给定一个介于 [0-5] 之间的有限正整数序列 假设 [0,3,1,5,2,4,4,4] 和起始序列 [0,0,0,0,0,0,0,0]。 我们现在想通过执行逐步操作从起始序列构建我们的给定序列。 在一个步骤中,我们可以将起始序列中的所有数字增加 1,或者仅将这个序列中的一个索引增加 1。 在这种情况下,一旦我们增加 5,它就会变成 0。
找到所需步骤最少的解决方案的最有效方法是什么?这个解决方案当然也应该适用于其他输入(长度+上限)。对于起始序列,我们可以假设每个索引始终为 0。
蛮力方法可能如下所示。
int upperBound = 5;
int[] endSequence = {0,3,1,5,2,4,4,4};
int currentBestSteps = Integer.MAX_VALUE;
int currentTimesIncreaseAll = 0;
for(int start = 0;start <= upperBound;start++){ //how many times to increase all
//counter how many steps required total, starting with start amount of steps
//since we increase all values 'start' times
int counterSteps = start;
//go through all end values and calc how many steps required
for(int end:endSequence){
if(start <= end){
counterSteps += end-start;
}else{
counterSteps += end+upperBound+1-start;
}
}
System.out.println("solution: increase all "+start+
" times, total steps: "+counterSteps);
if(counterSteps < currentBestSteps){
currentBestSteps = counterSteps;
currentTimesIncreaseAll = start;
}
}
System.out.println("best solution: increase all "+currentTimesIncreaseAll+
" times, total steps: "+currentBestSteps);
结果:
solution: increase all 0 times, total steps: 23
solution: increase all 1 times, total steps: 22
solution: increase all 2 times, total steps: 21
solution: increase all 3 times, total steps: 20
solution: increase all 4 times, total steps: 19
solution: increase all 5 times, total steps: 30
best solution: increase all 4 times, total steps: 19
【问题讨论】:
-
本案例的最佳解决方案是将所有索引增加 4 倍,当然,您必须继续单独增加每个索引!= 4。因此,例如,要为索引 1 获得 3,您需要 5 个步骤。总共需要 19 个步骤。
-
我认为您只需要测试 increase-all 的数量作为列表中的唯一值之一,而不是从 0 到
upperBound的所有值。在这里没有什么区别,但如果 upperBound 是一百万并且数组只有几百个元素,则可能很重要。
标签: algorithm performance brute-force