题目
算法题:
(1)给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
输入:nums = [1,2,3,1]
输出:true
解法1,使用HashSet
使用HashSet来存储数组中的元素,同时遍历数组。如果遍历过程中发现某个元素已经在HashSet中存在,那么就返回true,表示至少有一个值出现了至少两次。如果遍历结束后都没有发现重复的元素,则返回false
import java.util.HashSet;
import java.util.Set;
public class Solution {
public static boolean containsDuplicate(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) {
if (set.contains(num)) {
return true; // 发现重复元素,返回true
}
set.add(num); // 将元素添加到集合中
}
return false; // 遍历结束,没有发现重复元素,返回false
}
public static void main(String[] args) {
int[] nums = {1, 2, 3, 1};
boolean result = containsDuplicate(nums);
System.out.println(result); // 输出应为true
}
}
解法2 使用HashMap
使用HashMap同样可以实现检查数组中是否存在重复元素的功能。HashMap在Java中通常用于存储键值对,其中键是唯一的。在这个问题中,我们可以将数组中的元素作为键存储到HashMap中。如果在添加元素时发现键已经存在,则说明数组中有重复元素
import java.util.HashMap;
import java.util.Map;
public class Solution {
public static boolean containsDuplicate(int[] nums) {
Map<Integer, Boolean> map = new HashMap<>();
for (int num : nums) {
if (map.containsKey(num)) {
return true; // 发现重复元素,返回true
}
map.put(num, true); // 将元素作为键添加到HashMap中
}
return false; // 遍历结束,没有发现重复元素,返回false
}
public static void main(String[] args) {
int[] nums = {1, 2, 3, 1};
boolean result = containsDuplicate(nums);
System.out.println(result); // 输出应为true
}
}
总结
使用HashSet
或HashMap
的解法时间复杂度都是O(n),其中n是数组的长度。这是因为这两种数据结构都提供了常数时间复杂度的插入和查找操作。
当你遍历数组中的每个元素时,对于每个元素,你都在做以下操作之一:
- 检查元素是否已经在
HashSet
或HashMap
中(O(1)时间复杂度)。 - 如果不在,将其添加到
HashSet
或作为键添加到HashMap
中(O(1)时间复杂度,在平均情况下)。
因此,整体的时间复杂度是O(n),因为你只遍历了数组一次,并且对于数组中的每个元素都执行了常数时间的操作。
在Java中,无论是使用HashSet
还是HashMap
,你都可以得到一个时间复杂度为O(n)的解法。这两种数据结构在内部都是通过哈希表实现的,它们的主要区别在于HashMap
存储键值对,而HashSet
只存储键。在这个特定的问题中,我们只需要关心键(即数组中的元素)是否存在,所以使用HashSet
可能会更直观一些,因为它专注于存储唯一键的集合。然而,使用HashMap
同样可以达到相同的效果,并且时间复杂度也是O(n)。