移除元素

15 阅读1分钟

思路:

遍历,当遇到目标元素时,末尾的元素向前移,末尾元素标记为已使用,移动到当前目标元素位置

这个也是双指针法,一个指向当前元素,另一个指向末尾元素。这个速度更快,不需要遍历到末尾

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
}