Topic
- Array
- Hash Table
Description
https://leetcode.com/problems/contains-duplicate/
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.
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
Analysis
方法一:暴力算法。时间复杂度:O(N²),空间复杂度:O(1)。
方法二:先排序,再查找。时间复杂度:O(NlogN),空间复杂度:O(1)。
方法三:用散列表缓存。时间复杂度:O(N),空间复杂度:O(N)。
Submission
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class ContainsDuplicate {
// 方法一:暴力算法
public boolean containsDuplicate1(int[] nums) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] == nums[j]) {
return true;
}
}
}
return false;
}
// 方法二:先排序,再查找
public boolean containsDuplicate2(int[] nums) {
Arrays.sort(nums);
for (int ind = 1; ind < nums.length; ind++) {
if (nums[ind] == nums[ind - 1]) {
return true;
}
}
return false;
}
// 方法三:用哈希表作缓存
public boolean containsDuplicate3(int[] nums) {
Set<Integer> cache = new HashSet<>();
for (int num : nums) {
if (cache.contains(num))
return true;
cache.add(num);
}
return false;
}
}
Test
import static org.junit.Assert.*;
import org.junit.Test;
public class ContainsDuplicateTest {
@Test
public void test() {
ContainsDuplicate obj = new ContainsDuplicate();
int[][] array = {{1, 2, 3, 1}, {1, 2, 3, 4},
{1, 1, 1, 3, 3, 4, 3, 2, 4, 2}};
assertTrue(obj.containsDuplicate1(array[0]));
assertFalse(obj.containsDuplicate1(array[1]));
assertTrue(obj.containsDuplicate1(array[2]));
assertTrue(obj.containsDuplicate2(array[0]));
assertFalse(obj.containsDuplicate2(array[1]));
assertTrue(obj.containsDuplicate2(array[2]));
assertTrue(obj.containsDuplicate3(array[0]));
assertFalse(obj.containsDuplicate3(array[1]));
assertTrue(obj.containsDuplicate3(array[2]));
}
}