正在做一个HackerRank问题:
https://www.hackerrank.com/challenges/equal/problem
如果问题基本上是给定一个数组,那么通过添加除数组中除一个元素之外的所有元素,找到使数组相等所需的最小加法数。要添加的可能值为1,2,5。
因此,如果我们有一个[2,2,3,7]
数组,我们可以这样做:
Choose i = 3 as the excluded element and add all other by 5:
[7,7,8,7]
Choose i = 2 as the excluded and add by 1:
[8,8,8,8]
This gives minimum of 2 additions.
到目前为止,我在算法方面的目标是:
我有一个Entry对象:
public class entry {
int[] arr;
int count;
public entry(int[] arr, int count) {
this.arr = arr;
this.count = count;
}
}
因为我们需要传入一个新的数组添加数(计数)
我对算法的高级规范是:
Entry object e with the given arr and count = 0
int[] poss = {1,2,5};
static int minOps(entry e, LinkedList<entry> dpMem) {
int min = Integer.MAX_VALUE;
if (equal(e.arr)) {
return e.count;
}
int dpCount = checkdpMem(dpMem, e.arr); //checking if already solved
if (dpCount != -1) { //if solved
return dpCount;
} else {
for (int i = 0; i < poss.length; i++) {
for (int chosenIndex = 0; chosenIndex < e.arr.length; chosenIndex++) {
int temp = minOps(increment(e, chosenIndex, poss[i]), dpMem);
if (temp < min) {
min = temp;
}
}
}
}
return min;
}
正在发生的事情是它陷入无限循环,因为它会连续增加除了第一个1之外的所有其他元素。我需要做的是改变所选择的排除指数,但我不确定如何以“正确”的方式这样做。这是因为有时候你想要以相同的“方式”多次继续增加(即:除了arr [0]之外的所有内容增加x次,直到它们相等为止)。
思考?提前谢谢!