{{docContent.title}}

(双指针法)删除排序数组中的重复项

我的解法:

我这里用的是最笨的暴力穷举法,一个一个判断,然后删除重复的元素

func removeDuplicates(nums []int) int {
	for i := 0; i < len(nums); i++ {
		if indexArray(nums[i], nums) {
			// 这里说明存在重复,我们把所有的数据都往前移
			for j := i; j < len(nums)-1; j++ {
				nums[j] = nums[j+1]
			}
			nums = nums[:len(nums)-1]
			i--
		}
	}
	return len(nums)
}

// 判断array是否在数组中重复
func indexArray(i int, nums []int) bool {
	var count int = 0
	for _, v := range nums {
		if v == i {
			count++
			if count > 1 {
				return true
			}
		}
	}
	return false
}

双指针法:

看到官方解法的一瞬间,我就发现我好蠢,这个数组其实是一个有序数组,所以重复的内容一定会出现在一起,这就是双指针可以执行的原因。

官方的双指针法其实就是通过两个指针,一个指针用来计数一个用来判断重复度


func removeDuplicates(nums []int) int {
        // 如果长度为0,直接退出
	if len(nums) == 0 {
		return 0
	}
	i := 0
        // 这里我们遍历数组
	for j := 1; j < len(nums); j++ {
                // 这里就是关键部分,如果发现数字重复,我们就不管,如果不重复那么就i+1
                // 然后我们这里替换一下用于替换重复项
		if nums[i] != nums[j] {
			i++
			nums[i] = nums[j]
		}
	}
	return i + 1
}

func main() {
	log.Println(removeDuplicates([]int{0, 0, 1, 1, 1, 2, 2, 3, 3, 4}))
}