题目描述
Given an array of integers, find if the array contains any duplicates.
Your function should return true if any value appears at least twice in the array, and it should return false if every element is distinct.
给定一个整数数组,查找该数组是否包含任何重复项。如果数组中有出现次数大于等于两次的数字,函数应该返回true;如果每个元素都是不同的,函数应该返回false。
Example 1:
Input: [1,2,3,1] Output: true
Example 2:
Input: [1,2,3,4] Output: false
Example 3:
Input: [1,1,1,3,3,4,3,2,4,2] Output: true
思路一
对数组进行排序,然后遍历排序后的数组,若发现相邻元素相等则返回true,时间复杂度主要由排序算法主导,为O(nlogn),若使用堆排序则空间复杂度为O(1)
public boolean containsDuplicate(int[] nums) {
Arrays.sort(nums);
for (int i = 0; i < nums.length - 1; ++i) {
if (nums[i] == nums[i + 1]) return true;
}
return false;
}
思路二
利用遍历和插入的时间复杂度均为O(n)的HashSet来存放数组,因为要建一个长度为n哈希集合,所以空间复杂度为O(n)
public boolean containsDuplicate(int[] nums) {
Set<Integer> set = new HashSet<>(nums.length);
for (int x: nums) {
if (set.contains(x)) return true;
set.add(x);
}
return false;
}
思路三
暴力遍历该数组,将每次遍历的元素与其余元素比较是否相等,很显然有两重循环,时间复杂度为O(n^2)
public boolean containsDuplicate(int[] nums) {
for (int i = 0; i < nums.length; ++i) {
for (int j = 0; j < i; ++j) {
if (nums[j] == nums[i]) return true;
}
}
return false;
}
// Time Limit Exceeded