我正在尝试解决一个问题,我需要找到索引较低的重复数字。
例如,如果数组是 {1,4,3,5,3,2,1} 然后答案应该是 3 ,因为它是较小的索引然后是下一个重复的整数1.
如果未找到重复的数字,则需要返回-1。 我需要编写一个以o(n)时间复杂度刺激它的程序。
我能够解决它的O(n ^ 2)概率,但不知道如何为O(n)做到这一点。如果没有找到重复的数字,我也不理解如何实现。 请帮助我。我被困在这里。
提前谢谢。
到目前为止我的代码:
import java.util.ArrayList;
import java.util.Collections;
public class firstDuplicate
{
//defining array
public static void main(String args[])
{
int[] a1 = new int[] {2,3,3,1,5,2};
//int[] a1 = new int[] {2,3,4,1,5,8};
for(int i=0;i<a1.length; i++)
{
System.out.println(a1[i]);
}
int counter =0;
ArrayList<Integer> list1 = new ArrayList<>();
for(int i =0; i<a1.length; i++)
{
for(int j=i+1;j<a1.length; j++)
{
if(a1[i]==a1[j])
{
counter =counter+1;
System.out.println(j);
list1.add(j);
}
else {
int k =-1;
System.out.println(k);
}
}
}
System.out.println("Printing ur numbers of repetation");
System.out.printf("%d",counter);
System.out.println("If printed ur answer is following");
int k = Collections.min(list1);
System.out.println(k);
}
}
答案 0 :(得分:1)
您可以这样继续:
检查元素是否已在Set
中答案 1 :(得分:0)
编辑:感谢Saka1029和Patrick Parker。
Idea保持不变 - 我们使用Set来查找第一个重复元素,而不是拆分添加和检查元素是否已经存在于Set中的两个单独的操作中(我们通常希望找到第一个重复的元素)尽可能少的步骤 - 在'if'(存在于Set中)和'else'(添加到Set)结构中,我们可以将其简化为单个'if'语句,如Saka1029指出的那样。
public static int findDuplicateWithLowestIndext(int... a){
Set<Integer> set = new HashSet<>();
for(int num : a){
// since add() returns a true if elemenet was added and false if it wasn't -
// due to being duplicate - we can add elements and look for duplicate
// at the same time
if(!set.add(num)){
return num;
}
}
return -1;
}
至于bigO,为了简单起见我会这样说:因为我们遍历整个数组和方法体中的一次,我们使用Set中的一个add()方法,它本身就是O(1) - 这就是我们最终得到O(n)的方式 - 虽然这是简化的方式。
答案 2 :(得分:0)
您可以使用流/查找组合获取所有重复值的第一个索引:
List<Integer> l = List.of(1,4,3,5,3,2,1);
l.stream()
//Compute a map of elements -> occurrence count:
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
.entrySet()
.stream()
//Limit stream to values occurring more than once
.filter(it -> it.getValue() > 1)
//Find the first index of each key
.map(entry -> l.indexOf(entry.getKey()))
.collect(Collectors.toList())
以上返回此列表:
[0, 2]
答案 3 :(得分:0)
O(n)解决方案如下:
<强> Demo 强>
public static void main (String[] args) throws java.lang.Exception {
System.out.println(getLowestDuplicate(1,4,3,5,3,2,1)); // 3
System.out.println(getLowestDuplicate(2,3,3,1,5,2)); // 3
System.out.println(getLowestDuplicate(1,4,5,3,2)); // -1
}
public static int getLowestDuplicate(int... numbers) {
int[] counters = new int[10];
for (int i : numbers) {
if (counters[i] == 1) return i;
counters[i] = counters[i] + 1;
}
return -1;
}