力扣(LeetCode) 27: 移除元素 - 解法思路

问题概述

给定一个数组和一个值,原地删除所有等于该值的元素。返回不等于该值的元素数量。

解法 1:双指针(推荐)

工作原理

使用两个指针:一个(k)跟踪下一个非 val 元素的位置,另一个(i)遍历数组。将非 val 元素复制到前面:

python 复制代码
class Solution:
    def removeElement(self, nums, val):
        k = 0
        for i in range(len(nums)):
            if nums[i] != val:
                nums[k] = nums[i]
                k += 1
        return k

复杂度分析

  • 时间复杂度: O(n) - 单次遍历数组
  • 空间复杂度: O(1) - 只使用常数额外空间

何时使用

  • 推荐 - 标准方法,保持相对顺序
  • 简单直观
  • 适用于所有情况

解法 2:双指针交换

工作原理

从两端使用两个指针。当找到 val 时,将其与最后一个元素交换并减小数组大小。当 val 很少时,这避免了复制:

python 复制代码
class Solution:
    def removeElement(self, nums, val):
        i = 0
        n = len(nums)
        
        while i < n:
            if nums[i] == val:
                nums[i] = nums[n - 1]
                n -= 1
            else:
                i += 1
        
        return n

复杂度分析

  • 时间复杂度: O(n) - 每个元素最多访问两次
  • 空间复杂度: O(1) - 只使用常数额外空间

何时使用

  • 当 val 很少时(出现次数少)
  • 顺序不重要(交换元素)
  • 在某些情况下由于赋值更少而稍快

对比

方法 时间 空间 最佳适用
双指针 O(n) O(1) 大多数情况,保持顺序
双指针交换 O(n) O(1) 当 val 很少时,顺序不重要

总结

标准的双指针方法在大多数情况下是推荐的,因为它保持了元素的相对顺序。当要删除的值很少时,交换方法可能更快,但它会改变剩余元素的顺序。两种解决方案都具有 O(n) 时间和 O(1) 空间复杂度。

相关推荐
空中湖2 分钟前
SCL-90的微服务健康检查——90个探针覆盖10个心理维度
程序人生
水上冰石3 分钟前
comfui的sd1.5模型,有多少采样算法,详解每一个采样算法
人工智能·算法
l1t7 分钟前
DeepSeek总结的使用实体-组件-系统和基于存在性处理进行Python编程18-20
开发语言·python
零梦ing14 分钟前
Claude Code 升级后 DeepSeek API 报错 messages[x].role: unknown variant system 终极解决方案
python·claude code·deepseek api 代理
黎阳之光20 分钟前
视频孪生+空天地水工融合,黎阳之光构建智慧水利监测新范式
大数据·人工智能·物联网·算法·安全
凯瑟琳.奥古斯特26 分钟前
子查询原理与实战案例解析
开发语言·数据库·职场和发展·数据库开发
Eiceblue27 分钟前
Python 操作 Excel:数据分组、分类汇总与取消分组全解
开发语言·python·excel
南浦别a31 分钟前
第一百一十三天--慢慢改变吧
学习·程序人生
cheems952732 分钟前
[算法手记] 贪心 爬楼梯问题
算法·贪心算法
KaMeidebaby44 分钟前
卡梅德生物技术快报|酵母双杂交 cDNA 文库构建与蛋白互作筛选流程
服务器·前端·数据库·人工智能·算法