力扣 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
}
心得体会
当人有一个解决方案后,很难再想另外一套解决方案,如果我的文章不被打回来,我也应该不会去想第二套逻辑,我觉得我应该保持这种习惯,当解决问题后,能够认真复判,看看,能否有更高效的解决方案。
欢迎转发!
请保留源地址: https://www.cnblogs.com/NoneID

浙公网安备 33010602011771号