27.移除元素(Remove Element)

mac2026-01-12  10

27.移除元素Remove Element

题解双指针1算法流程:复杂度分析PythonJava(待完成) 双指针2算法流程:复杂度分析PythonJava(待完成)

题解

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

双指针1

算法流程:

定义指针 i = 0 i=0 i=0从第一个元素开始遍历,对于 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,指向下一位置最后一次 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

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

算法流程:

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

执行循环 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

返回 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)