数据结构与算法之 leetcode 数组去重 双指针 / 哈希表去重

数据结构与算法阿木 发布于 2 天前 1 次阅读


数组去重:双指针与哈希表去重策略解析与实践

数组去重是编程中常见的问题,尤其是在处理数据时,我们需要确保数组中的元素是唯一的。在LeetCode等编程竞赛平台,数组去重问题也是高频考题。本文将围绕数组去重这一主题,分别介绍双指针和哈希表两种去重策略,并通过实际代码示例进行解析和实践。

双指针去重

原理

双指针去重的基本思想是使用两个指针,一个用于遍历数组,另一个用于指向下一个不重复元素的插入位置。通过比较当前遍历元素与插入位置指向的元素,我们可以决定是否将当前元素插入到结果数组中。

代码实现

以下是一个使用双指针去重的方法,适用于排序后的数组:

python

def removeDuplicates(nums):


if not nums:


return 0

slow = 0 指向下一个不重复元素的插入位置


for fast in range(1, len(nums)):


if nums[slow] != nums[fast]:


slow += 1


nums[slow] = nums[fast]

return slow + 1 返回去重后的数组长度


分析

- 时间复杂度:O(n),其中n是数组的长度。每个元素最多被访问两次,一次是快指针,一次是慢指针。

- 空间复杂度:O(1),不需要额外的存储空间。

哈希表去重

原理

哈希表去重利用哈希表(在Python中为字典)的特性,通过键值对存储数组元素,键为元素值,值为元素出现的次数。遍历数组时,将每个元素作为键插入哈希表,如果键已存在,则忽略该元素;否则,将键值对的值设置为1。将哈希表中的键值对转换为数组,得到去重后的数组。

代码实现

以下是一个使用哈希表去重的方法:

python

def removeDuplicates(nums):


if not nums:


return 0

hash_table = {}


for num in nums:


if num not in hash_table:


hash_table[num] = 1

return len(hash_table) 返回去重后的数组长度


分析

- 时间复杂度:O(n),其中n是数组的长度。每个元素最多被访问两次,一次是插入哈希表,一次是检查哈希表。

- 空间复杂度:O(n),在最坏的情况下,每个元素都是唯一的,需要存储n个键值对。

双指针与哈希表去重的比较

- 时间复杂度:双指针去重通常比哈希表去重更快,尤其是在数组已经排序的情况下。

- 空间复杂度:双指针去重只需要常数级别的额外空间,而哈希表去重需要与数组长度成比例的额外空间。

- 适用场景:双指针去重适用于排序后的数组,而哈希表去重适用于未排序的数组。

实践案例

假设我们有一个未排序的数组 `[1, 1, 2, 2, 3, 4, 4, 5, 5, 5]`,我们需要对其进行去重。

使用双指针去重

python

nums = [1, 1, 2, 2, 3, 4, 4, 5, 5, 5]


length = removeDuplicates(nums)


print(nums[:length]) 输出:[1, 2, 3, 4, 5]


使用哈希表去重

python

nums = [1, 1, 2, 2, 3, 4, 4, 5, 5, 5]


length = removeDuplicates(nums)


print(nums[:length]) 输出:[1, 2, 3, 4, 5]


总结

数组去重是编程中常见的问题,本文介绍了两种常用的去重策略:双指针和哈希表。双指针去重适用于排序后的数组,而哈希表去重适用于未排序的数组。在实际应用中,根据具体场景选择合适的去重方法可以提高代码的效率和可读性。