两个算法思想精髓;
1.对于数组而言,如果是要遍历作比较,完全可以先排序再比较,因为这样只需要跟其前一个或后一个数作比较;
2.Set思想,一次加一个元素,每次加入之前判断一下,如果某元素已存在Set中,则说明其是重复元素。
Code version one:
执行用时 :7 ms, 在所有 Java 提交中击败了45.50%的用户
内存消耗 :39.5 MB, 在所有 Java 提交中击败了30.89%的用户
class Solution {
public int findDuplicate(int[] nums) {
Arrays.sort(nums);
for(int i=1;i<nums.length;i++){
if (nums[i]==nums[i-1])
return nums[i];
}
return -1;
}
}
时间复杂度:O(nlogn)
空间复杂度:O(1)
Code version two:
执行用时 :9 ms, 在所有 Java 提交中击败了19.91%的用户
内存消耗 :41.5 MB, 在所有 Java 提交中击败了5.13%的用户
class Solution {
public int findDuplicate(int[] nums) {
Set<Integer> seen=new HashSet<Integer>();
for(int num:nums){
if(seen.contains(num))
return num;
else
seen.add(num);
}
return -1;
}
}
时间复杂度:O(n)
空间复杂度:O(n)