力扣(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 小时前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j
月光光心慌慌。8 小时前
企服商家智能体与自动化服务怎么选?2026防坑与选型指南
程序人生
aaaameliaaa8 小时前
字符函数和字符串函数
c语言·笔记·算法
笨鸟先飞,勤能补拙9 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
城管不管9 小时前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
长和信泰光伏储能9 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
月疯9 小时前
二分法算法(水平等分图形面积)
算法
豆瓣鸡10 小时前
算法日记 - Day3
java·开发语言·算法
浦信仿真大讲堂10 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
白白白小纯10 小时前
算法篇—反转链表
c语言·数据结构·算法·leetcode