1
所以我想通過下面的面試問題的工作:重新排列數組s.t.有一組中沒有重複
/** Given an unordered array of positive integers, create an algorithm that makes sure
no group of integers of size bigger than M have the same integers.
Input: 2,1,1,1,3,4,4,4,5 M = 2
Output: 2,1,1,3,1,4,4,5,4
*/
我想過一個的O(N^2)解決方案:遍歷數組和鄰近交換在給定組中重複的項目。但是因爲你有像1,2,3,4,1,1 M = 2這樣的情況,所以你不得不在數組後面環繞n次,給你多項式時間。
所以,我雖然下面的解決方案,這是應該的線性時間運行的:
public static int[] regroup(int[] input, int m) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i : input) {
if (!map.containsKey(i)) {
map.put(i, 1);
} else {
map.put(i, map.get(i) + 1);
}
}
int i = 0, n = 0;
while (i < input.length) {
for (int curr : map.keySet()) {
if (n == m) {
n = 0;
break;
}
if (map.get(curr) > 0) {
input[i] = curr;
map.put(curr, map.get(curr) - 1);
i++; n++;
} else {
continue;
}
}
}
return input;
}
這實質上使得HashMap中所有的值,它們的出現的#,然後挑選從每一個項目爲每個M大小的團隊設置桶,保證獨特的項目。雖然我已經運行到這個問題是下面的反例:
{2,1,1,1,3,4,4,4,5} M = 3
這將返回
[1, 2, 3, 1, 4, 5, 1, 4, 4]
其中明確是不正確的。發生了什麼事情就是在最後選擇獨特的項目,所以只需將4放入最後一組。任何人都可以想辦法解決這個問題並保持線性時間嗎?