问题描述
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。
思路
- 问题分析
原地修改数组,即利用原数组空间来完成元素的移动。 - 算法选择
双指针法(快慢指针):- 慢指针 i 用于记录下一个应保留元素的存放位置。
- 快指针 j 用于遍历整个数组。
当遍历到一个元素时,若该元素不等于 val,则将它复制到 nums[i] 的位置,同时将 i 加 1。这样在遍历结束后,nums[0] 到 nums[i-1] 中的所有元素均不等于 val,而 i 即为不等于 val 的元素个数。
- 边界情况
当数组为空时,循环不会执行,返回 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 的元素的原有相对顺序。
782

被折叠的 条评论
为什么被折叠?



