返回

用脚踏实地之道征服 LeetCode Top 100:轻松攻略删除有序数组重复项

前端

序言:算法进阶之路

算法是计算机科学的核心,而 LeetCode 是磨炼算法技能的绝佳平台。LeetCode Top 100 挑战更是算法进阶之路上的里程碑,旨在帮助你掌握最核心的算法和数据结构。今天,我们一起攻克 LeetCode Top 100 中的第 17 道题目:删除有序数组中的重复项。

题目解析:删繁就简,直击核心

题目要求我们给定一个有序数组,原地删除所有重复元素,并返回删除后数组的新长度。乍一看,这似乎是一个简单的问题,但想要高效解决,却需要我们对数组和算法有深刻的理解。

算法策略:双指针破局

解决本题,我们采用双指针法。两个指针分别指向数组的当前位置和结果数组的插入位置。当两个指针指向的元素相等时,我们移动当前指针,跳过重复元素。否则,我们将当前元素插入结果数组,并移动两个指针。

def remove_duplicates(nums):
    if not nums:
        return 0

    i = 0  # 当前指针
    j = 1  # 结果数组插入位置指针

    while j < len(nums):
        if nums[i] != nums[j]:
            nums[j] = nums[i]
            i += 1
            j += 1
        else:
            j += 1

    return j

代码解析:步步为营,剖析算法

代码实现并不复杂,但蕴含着算法的精髓:

  • 边界处理: 首先判断数组是否为空,如果是,直接返回 0。
  • 双指针遍历: 使用两个指针 ij 从头到尾遍历数组。
  • 元素比较: 如果 nums[i]nums[j] 相等,说明遇到重复元素,移动 j 指针跳过重复项。
  • 插入结果: 如果元素不同,将 nums[i] 插入结果数组 nums[j],并同时移动 ij 指针。
  • 返回长度: 最后,返回结果数组的长度,即 j 的值。

算法复杂度:快慢相随,高效求解

算法的时间复杂度为 O(n),其中 n 是数组的长度。因为每个元素最多被遍历两次,一次是当前指针遍历,另一次是插入结果数组时。空间复杂度为 O(1),因为我们原地修改了数组,没有使用额外的空间。

结语:算法修行,精益求精

删除有序数组中重复项只是算法进阶道路上的一个小小的挑战。通过解决这类问题,我们可以逐步提升自己的算法思维和编程能力。LeetCode Top 100 挑战提供了丰富的题目库,涵盖了各种算法和数据结构,是算法修行者必不可少的磨刀石。让我们继续踏上算法进阶之路,用脚踏实地的努力,解锁算法之美,征服编程巅峰!