我正在接受一些采访编码练习问题,我偶然发现了以下内容:
给定一个数组arr
,我们希望它通过递增arr
中的任何重复元素使其唯一,以使arr
唯一元素的总和最小。换句话说,如果arr
中的两个或多个元素不是唯一的,我们必须将重复元素的值增加到其他一些数字,使arr
由独特的元素组成总和到尽可能小的数字。
例如,如果arr = [3, 2, 1, 2, 7]
,则arr unique = [3, 2, 1, 4, 7]
及其元素总和为3 + 2 + 1 + 4 + 7 = 17
的最小值。
完成getMinimumUniqueSum函数。它有一个参数:一个由n个整数组成的数组arr
。该函数必须返回一个整数,表示arr
唯一元素的总和。
我的第一种方法是使用合并排序对数组进行排序,然后查找重复项并将其递增。
public void initiateMergeSort(int lowerIndex, int higherIndex) {
if (lowerIndex < higherIndex) {
int middle = lowerIndex + (higherIndex - lowerIndex) / 2;
// sorting left side of the array
initiateMergeSort(lowerIndex, middle);
// sorting right side of the array
initiateMergeSort(middle + 1, higherIndex);
// merging both sides
computeMergeSort(lowerIndex, middle, higherIndex);
}
}
private void computeMergeSort(int lowerIndex, int middle, int higherIndex) {
for (int i = lowerIndex; i <= higherIndex ; ++i) {
tempMergeArray[i] = defaultArray[i];
}
int i, j, k;
// we initialise i and k to the leftmost side of the array, and j being in the middle of the array
i = k = lowerIndex;
j = middle + 1;
// while i loops from beginning to middle of the array, and j from middle to the end of the array
while (i <= middle && j <= higherIndex) {
if (tempMergeArray[i] <= tempMergeArray[j]) {
defaultArray[k] = tempMergeArray[i];
i++;
} else {
defaultArray[k] = tempMergeArray[j];
j++;
}
k++;
}
while (i <= middle) {
defaultArray[k] = tempMergeArray[i];
k++;
i++;
}
}
public void getMinimumUniqueSum(int[] arrUnique) {
/**
* Todo:
* * get lowest and highest value from the array ✔
* * generate lowest unique random number between the range (lowest - highest)
* * loop through the array and look for duplicate and assign the unique number
* * do above recursively()
*/
int min = defaultArray[0], max = defaultArray[defaultArray.length - 1];
}
但是我真的陷入了必须增加重复值才能获得最低总和的部分。
任何人都可以帮忙。
由于
我的合并排序工作正常,它很好地排序了数组。
我们不允许使用任何java内置 - 本练习的目的是从头开始,并测试我们的算法能力。
请注意时间和空间的复杂性。如果可能的话,我试图在O(n)中实现这个目标
答案 0 :(得分:4)
如果您完成了排序,请使用此代码段使数字唯一:
Integer previous = null;
for (int i = 0; i < sortedInts.length; i++)
{
if (previous != null && previous >= sortedInts[i])
{
sortedInts[i] = previous + 1;
}
previous = sortedInts[i];
}
之后,你可以总结一下。或者,如果您想避免再次迭代数组,可以直接将sortedInts[i]
添加到结果变量中。上面的代码段纯粹是为了确保你有独特的内容。