27.移除元素(Remove Element)

题解

本题难点,原地修改
且在 O ( 1 ) O(1) O(1)空间下完成

双指针1

算法流程:

  1. 定义指针 i = 0 i=0 i=0
  2. 从第一个元素开始遍历,对于 n u m s [ j ] nums[j] nums[j]: 判断条件 n u m s [ j ] ! = v a l nums[j]!=val nums[j]!=val,如果满足,将这个值填入 n u m s [ i ] nums[i] nums[i],并令 i = i + 1 i=i+1 i=i+1,指向下一位置
  3. 最后一次 i i i加了1,所以返回长度时无需加1.

复杂度分析

  • 时间复杂度: O ( n ) O\left(n\right) O(n),只扫描了一遍
  • 空间复杂度: O ( 1 ) O(1) O(1)

Python

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        n=len(nums)
        i=0
        for j in range(n):
            if(nums[j]!=val):
                nums[i]=nums[j]
                i=i+1
        return i

Java(待完成)

双指针2

另外一种双指针写法,首尾交换

算法流程:

  1. 定义左指针 l = 0 l=0 l=0和右指针 r = n r=n r=n **特别注意:**这里右指针 r = n r=n r=n,这样可以将很多特例如:[1],1包含在内

  2. 执行循环 l < r l<r l<r

    • 如果 n u m s [ l ] = = v a l nums[l]==val nums[l]==val,则交换 n u m s [ l ] nums[l] nums[l] n u m s [ r ] nums[r] nums[r],表示,如果左端值等于 v a l val val,则和右端交换。并令右端 r = r + 1 r=r+1 r=r+1,表示这个位置已经放了 v a l val val,和下一位置交换
    • 若不满足条件,则令左端指向下一元素 l = l + 1 l=l+1 l=l+1
  3. 返回 l l l,这里因为右指针初始化为 n n n,可结合例子,发现i即为最终长度

重点:
一定要结合例子体会右指针初始化为数组长度 n n n

复杂度分析

  • 时间复杂度: O ( n ) O\left(n\right) O(n),只扫描了一遍
  • 空间复杂度: O ( 1 ) O(1) O(1)

Python

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        n=len(nums)
        l=0
        r=n
        while(l<r):
            if(nums[l]==val):
                nums[l],nums[r-1]=nums[r-1],nums[l]
                r=r-1
            else:
                l=l+1
        return l

Java(待完成)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值