思路:
遍历,当遇到目标元素时,末尾的元素向前移,末尾元素标记为已使用,移动到当前目标元素位置
这个也是双指针法,一个指向当前元素,另一个指向末尾元素。这个速度更快,不需要遍历到末尾
func removeElement(nums []int, val int) int {
removeCount := 0
lenth := len(nums)
i := 0
for i < lenth-removeCount {
//不需要判断是否为-1,因为到不了这个条件
//if nums[i] == -1 {
// break
//}
if nums[i] == val {
nums[i] = nums[lenth-removeCount-1]
nums[lenth-removeCount-1] = -1
removeCount++
continue
}
i++
}
return lenth - removeCount
}
这个写法可以简化一下
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
}
双指针法,更标准的做法
使用两个指针,一个快指针fast遍历数组,一个慢指针slow指向最新的不含指定值val的数组末尾。当fast指向的值不等于val时,将其复制到slow的位置,并同时增加slow。
func removeElement(nums []int, val int) int {
cur:=-1
i := 0
lenth := len(nums)
for i < lenth {
if nums[i]!=val{
cur++
nums[cur]=nums[i]
}
i++
}
return cur+1
}