[英]Sort duplicates inside array in different sub arrays
我有一个包含以下格式重复项的数组:
arr[]={ 2,9,1,5,1,4,9,7,2,1,4 }
我想对数组进行排序,以使所有重复元素都移到末尾,并在不同的子数组中进行排序,如下所示:
arr[]={ 1,2,4,5,7,9, 1,2,4,9, 1 }
指定的数组没有整数范围。 以下是我尝试过的代码。 此代码以递归方式对子数组进行排序,然后将重复项移到末尾。 但是,复杂性并不是最佳解决方案。
请提出是否可以在O(n)
或O(nlogn)
求解。 整个代码如下:
public static int sortDuplicates(int a[],int start,int end){
int i, k,temp;
if(start==end)
return 1;
Arrays.sort(a, start, end);
k = start;
for (i = start+1; i < end; i++) {
if (a[k] != a[i] && a[k]<a[i])
{
temp=a[k+1];
a[k+1] = a[i];
a[i]=temp;
k++;
}
}
return sortDuplicates(a,k+1,a.length);
}
我将按以下方式处理:
将所有元素及其计数放入哈希图中:
int[] arr={ 2,9,1,5,1,4,9,7,2,1,4 };
Map<Integer, Integer> map = new HashMap<>();
for (int elt : arr) {
int val = 1;
if (map.containsKey(elt))
val = map.get(elt) + 1;
map.put(elt, val);
}
一张一张地取出批次:
List<Integer> result = new ArrayList<>();
while (map.size() > 0) {
List<Integer> subList = new ArrayList<>(); // for the current segment
Iterator<Integer> it = map.keySet().iterator();
while (it.hasNext()) {
int elt = it.next();
subList.add(elt);
if (map.get(elt) == 1) { // remove all elements with occurence = 1
it.remove();
} else { // reduce occurence by 1
map.put(elt, map.get(elt)-1);
}
}
Collections.sort(subList); // sort this segment
result.addAll(subList); // append to result
}
for (int i : result) {
System.out.print(i + " ");
}
此打印
1 2 4 5 7 9 1 2 4 9 1
如果我没记错的话,它可以在O(n log n)
。
我将按照以下方式进行处理。
将所有元素及其数量放入平衡的二叉搜索树中。
现在以有序的方式遍历树,并继续将元素(具有count > 0
)放入数组中,并将其数量减少1。
创建树的时间复杂度为O(nlgn)
,从树中放置元素的时间复杂度为O(n)
,空间复杂度为O(n)
。
问题是,如果没有任何元素被重复,那么我们将徒劳地创建树。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.