带有重复项和整数N的整数列表。从列表中删除重复项,找到修改后列表中的第N个最大元素。
实现至少两种不同的解决方案,以Big-O表示法找到具有O(N * log(N))平均时间复杂度的第N个最大元素,其中N是列表中元素的数量
以下是我想到的解决方案是否有更好的实施方式?另外,我如何实现两种不同的解决方案?
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] list= {5,3,8,2,5,7,6,7,3,7};
int n = 3;
System.out.println("Printing list before removing duplicates");
for (int i : list) {
System.out.println(i+" ");
}
for (int i = 0; i < list.length; i++) {
for (int j = i+1; j < list.length; j++) {
if (list[i] < list[j]) {
int swap = list[i];
list[i] = list[j];
list[j]=swap;
}
if (list[i] == list[j]) {
list[j] = 0;
}
}
}
System.out.println("Printing list after removing duplicates");
for (int i : list) {
System.out.println(i+" ");
}
System.out.println("the N-th largest element in the modified list is"+ list[n-1]);
}
答案 0 :(得分:3)
对于这类问题,你真的需要看看为你提供了哪些语言工具,以及如何利用它们为你做出艰苦的工作。
要删除重复项,只需将它们放入Set
即可。要对它们进行排序,请使用TreeSet
。
所以你得到:
Set<Integer> values = new TreeSet<Integer>();
这会将它们从最小到最大排序,以反转顺序为TreeSet
指定你自己的比较器,它只是反转自然顺序。
然后迭代Set
,迭代器返回的第n个值就是你的值。
您当前的代码看起来大部分都是有效的,但它实际上并没有删除重复项 - 您需要实际从数组中删除内容,而数组不支持而不重新创建它们,因为它们无法调整大小。此外,如果您包含0或负数,它将会混淆。例如,( - 3,-5,-6,-6)中的最大数字将返回为0。
答案 1 :(得分:0)
如果您从集合开始,每个任务一行。
List<Integer> list = new ArrayList<Integer>(Arrays.asList(5,3,8,2,5,7,6,7,3,7));
删除重复项:
List<Integer> nodups = new ArrayList<Integer>(new HashSet<Integer>(list));
找到最大的:
Integer largest = Collections.max(list);
答案 2 :(得分:0)
除非出于某种原因你只能使用原语,Tim的答案解决了排序问题。要实现多个“解决方案”,只需创建两个不同的函数,它们将数字列表和值n
作为参数:
public void firstSolution(int[] numbers, int n) {
// one implementation
}
public void secondSolution(int[] numbers, int n) {
// another implementation
}
然后只需在main
中进行适当的函数调用。