存在重复元素(难度:简单)
方法一:哈希表
复杂度
时间复杂度 : O(n)。search() 和 insert() 各自使用 n
次,每个操作耗费常数时间。
空间复杂度 : O(n)。哈希表占用的空间与元素数量是线性关系。
代码
1 2 3 4 5 6 7 8 9 10 11
| class Solution { public boolean containsDuplicate(int[] nums) { Set<Integer> res = new HashSet<>(); for(int num:nums){ if(res.contains(num)) return true; res.add(num); } return false; } }
|
另一种思路:利用Python中的set(),判断所得结果长度与原数组长度的关系
1 2 3 4 5 6 7
| class Solution: def containsDuplicate(self, nums: List[int]) -> bool: set1 = set(nums) if len(set1) == len(nums): return False else: return True
|
方法二: 排序
如果存在重复元素,排序后它们应该相邻。
复杂度
时间复杂度 : O(nlogn)。
空间复杂度 : O(1)。这取决于具体的排序算法实现,通常而言,使用
堆排序
的话,是 O(1)。
代码
1 2 3 4 5 6 7 8 9 10
| class Solution { 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; } }
|
注:对于一些特定的
n不太大的测试样例,方法一的运行速度可能会比方法二更慢。这是因为哈希表在维护其属性时有一些开销。要注意,程序的实际运行表现和
Big-O 符号表示可能有所不同。Big-O 只是告诉我们在
充分大的输入下,算法的相对快慢。因此,在
n不够大的情况下, O(n)的算法也可以比 O(nlogn)的更慢。