Solution 1: 交换复制,首位双指针
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
# i记录当前元素下标,j记录被换元素的下标
i, j = 0, len(nums)-1
# 从前往后遍历
while i <= j:
# 如果当前元素==val,互换nums[i]和nums[j]
if nums[i] == val:
tmp = nums[i]
nums[i] = nums[j]
nums[j] = tmp
j -= 1
# 如果当前元素!=val,i++
else:
i += 1
# 最后,nusm[0:i]是不等于val的元素数组,返回i
return i
Solution 2: 拷贝复制,双指针都从头开始
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
slow = 0
fast = 0
k = len(nums)
while fast < k:
print(slow, fast, nums)
if nums[fast]==val:
fast = fast + 1
else:
print('hello')
nums[slow] = nums[fast]
slow = slow + 1
fast = fast + 1
return slow
复杂度分析
下面参考题解分析时间复杂度、空间复杂度、两种解法的适用情况,讲解清晰
参考题解
https://leetcode.cn/problems/remove-element/solutions/10388/hua-jie-suan-fa-27-yi-chu-yuan-su-by-guanpengchn/