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

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

题目


image.png

image.png



想法


分析问题

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


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

ps: 假设下标不会越界

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


image.png


从第3个节点开始计算

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


image.png


当前节点以此往后移

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

image.png


直到数据至末尾


image.png




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

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个永远满足需求,所以从第三个元素开始判断是否要加入:

image.png


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


image.png

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

有效下标+1

image.png


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

image.png


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

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

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
}




心得体会


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

相关文章
|
2月前
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
38 2
|
4月前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
2月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
21 4
|
2月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
42 0
|
4月前
|
算法
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
|
4月前
|
算法
LeetCode第80题删除有序数组中的重复项 II
文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。
LeetCode第80题删除有序数组中的重复项 II
|
4月前
|
算法
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。
|
4月前
|
Python
【Leetcode刷题Python】108. 将有序数组转换为二叉搜索树
LeetCode上108号问题"将有序数组转换为二叉搜索树"的Python实现,通过递归选取数组中间值作为根节点,构建高度平衡的二叉搜索树。
28 2
|
4月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
56 0
|
4月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
48 0