力扣 80. 删除有序数组中的重复项 II

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目

想法

分析问题

题目意思大概为 提供给我们的数组是有序的,且每个数字最多出现2次,我们调整完毕后必须回写到该数组,并且返回正确的数据个数。

方法1: 定义临时数据求解

ps: 假设下标不会越界

将前2个数据写入临时节点数据

从第3个节点开始计算

若三个数据一致,则不往临时节点写入数据

当前节点以此往后移

三个节点数据不一致,则写入临时节点

直到数据至末尾

在写入临时节点的时候,进行自增,后将这个值返回回去即可

func removeDuplicates(nums []int) int {
	if len(nums) <= 2 {
		return len(nums)
	}

	var rn []int
	var last1num int
	var last2num int
	sum := 2
	rn = append(rn, nums[0])
	rn = append(rn, nums[1])
	for i:=2;i<len(nums);i++ {
		last2num = nums[i-1]
		last1num = nums[i-2]
		if last1num == last2num && last2num == nums[i] {
			continue
		}
		rn = append(rn, nums[i])
		sum++
	}
	for i:=0;i<len(rn);i++ {
		nums[i] = rn[i]
	}
	return sum
}

方法2: 在原数组基础上修改

因为题目中提到的 每个元素最多出现 2次 , 所以,不管怎么样,只要数组长度大于2 ,那么 前2个元素,一定是正确的。

不管数组后续内容是什么,在长度满足的条件下,前2个永远满足需求,所以从第三个元素开始判断是否要加入:

判断当前节点数据(1) 和 有效下标上一个数据(1) 相等,所以该数据不加入,正在处理的节点向后移动

判断当前节点数据(2)和 有效下标上一个数据(1) 不相等 , 所以加入该数据,加入方式为 有效下标+1, 将正在处理的节点 赋值 给 有效下标指向的数据

有效下标+1

当前数据赋值至有效下标指向的数据

正在处理的节点持续增加,直至末尾

由此,我们可以顺利编写出伪代码

func removeDuplicates(nums []int) int {
	if len(nums) <= 2 {
		return len(nums)
	}
    
    i = 2 // 有效指针
    j = 3 // 正在处理的指针
    
    for (;j<len(nums);j++) {
        if 当前节点 != 有效指针指向的上一个节点
            i++ // 有效指针+1
            
            有效指针指向的节点 = 当前节点
    }
    return i
}

代码编写

func removeDuplicates(nums []int) int {
	if len(nums) <= 2 {
		return len(nums)
	}

	var i = 1 // 有效指针
	var j = 2 // 正在处理的指针

	for ;j<len(nums);j++ {
		if nums[j] != nums[i-1] {
			i++
			nums[i] = nums[j]
		}
	}
	return i+1
}

心得体会

当人有一个解决方案后,很难再想另外一套解决方案,如果我的文章不被打回来,我也应该不会去想第二套逻辑,我觉得我应该保持这种习惯,当解决问题后,能够认真复判,看看,能否有更高效的解决方案。

posted @ 2022-03-30 14:44  pdudos  阅读(0)  评论(0)    收藏  举报  来源