leetcode27 移除元素

问题描述

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。

思路

  1. 问题分析
    原地修改数组,即利用原数组空间来完成元素的移动。
  2. 算法选择
    双指针法(快慢指针):
    • 慢指针 i 用于记录下一个应保留元素的存放位置。
    • 快指针 j 用于遍历整个数组。
      当遍历到一个元素时,若该元素不等于 val,则将它复制到 nums[i] 的位置,同时将 i 加 1。这样在遍历结束后,nums[0] 到 nums[i-1] 中的所有元素均不等于 val,而 i 即为不等于 val 的元素个数。
  3. 边界情况
    当数组为空时,循环不会执行,返回 0。
    当数组所有元素都等于 val 时,slow 指针不会前移,返回 0。

代码

class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """
        # 慢指针,用于记录应保留元素的下一个插入位置
        i = 0
        # 快指针,用于遍历整个数组
        for j in range(len(nums)): 
            # 如果当前元素不等于val,则应该保留该元素
            if(nums[j] != val):
                nums[i] = nums[j]
                i += 1
        return i

拓展总结

  • 双指针
    • 常用于需要在原数组上进行“过滤”、“删除”、“划分”等操作的题目。
    • 快指针负责扫描,慢指针负责构建最终数组。
    • 快慢指针法可以在线性时间复杂度 O(n) 内完成遍历,并且只使用常数级额外空间 O(1)。
  • 原地操作
    • 原地操作意味着不能使用额外的数据结构存储结果,当需要删除一些元素时,我们要将剩余的元素重新排列,通常通过指针或索引变量遍历数组,重新将它们赋值到数组的前面部分,覆盖掉原来不需要的数据。
    • 快慢指针方法天然保留了不等于 val 的元素的原有相对顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值