力扣(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) 空间复杂度。

相关推荐
八零后琐话1 分钟前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
月挽清风2 分钟前
代码随想录第十五天
数据结构·算法·leetcode
XX風19 分钟前
8.1 PFH&&FPFH
图像处理·算法
NEXT0632 分钟前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠1 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
想进个大厂1 小时前
代码随想录day37动态规划part05
算法
青春不朽5121 小时前
Scrapy框架入门指南
python·scrapy
sali-tec1 小时前
C# 基于OpenCv的视觉工作流-章22-Harris角点
图像处理·人工智能·opencv·算法·计算机视觉
子春一1 小时前
Flutter for OpenHarmony:构建一个 Flutter 四色猜谜游戏,深入解析密码逻辑、反馈算法与经典益智游戏重构
算法·flutter·游戏