题目要求
解法一:
暴力解法,找到数组中相同的两个数,然后返回index最小的那个(最早出现的那个)
Time: O(n^2) Space: O(1)
代码:
import java.util.*;
class Program {
public int firstDuplicateValue(int[] array) {
// Write your code here.
if (array == null || array.length < 2) return -1;
int index = Integer.MAX_VALUE;
for (int i = 0; i < array.length - 1; i++) {
int first = array[i];
for (int j = i + 1; j < array.length; j++) {
int second = array[j];
if (first == second) {
index = Math.min(index, j);
}
}
}
return index == Integer.MAX_VALUE ? -1: array[index];
}
}
解法二:
用HashSet来发现重复项,不重复,加入set。如果发现重复立刻返回。
Time: O(n) Space: O(n)
代码:
import java.util.*;
class Program {
public int firstDuplicateValue(int[] array) {
// Write your code here.
if (array == null || array.length < 2) return -1;
HashSet<Integer> set = new HashSet<>();
for (int val : array) {
if (set.contains(val)) {
return val;
}
set.add(val);
}
return -1;
}
}
解法三:
首先本解法是建立在这个array里面的整数范围是1-n之间,所以这个解法不会越界。利用一个数组来模仿HashTable来找出重复项,*-1为了标记第一次遇到和第二次遇到两种状态。
Time: O(n) Space: O(1)
代码:
import java.util.*;
class Program {
//一维数组实现hashTable
//Abs() 还原原始数值,*-1利用原始数值进行标记(-/+), 两种状态(遇见1/2次)
public int firstDuplicateValue(int[] array) {
// Write your code here.
if (array == null || array.length < 2) return -1;
for (int val : array) {
int absVal = Math.abs(val);
if (array[absVal - 1] < 0) return absVal;
array[absVal - 1] *= -1;
}
return -1;
}
}