法一:双指针
解题思路:
left指针作为留在数组元素的索引,right指针遍历数组,把不为val值的元素放到left位置,为val值的不做处理。
时间复杂度:O(n)
空间复杂度:O(1)
func removeElement(nums []int, val int) int {
n:=len(nums)
left:=0
for right:=0;right<n;right++{
if nums[right]!=val{
nums[left]=nums[right]
left++
}
}
return left
}
tips:right遍历第二种写法:
func removeElement(nums []int, val int) int {
left := 0
for _, v := range nums { // v 即 nums[right]
if v != val {
nums[left] = v
left++
}
}
return left
}
法二:双指针优化
func removeElement(nums []int, val int) int {
left,right:=0,len(nums)-1
for left<=right{
if nums[left]==val{
nums[left]=nums[right]
right--
}else{
left++
}
}
return left
}