Go语言学习之力扣-删除有序数组中的重复项II|Go主题月

298 阅读1分钟

作者:看那个码农

公众号:看那个码农

上期内容介绍了Go语言学习之:=与=的区别|Go主题月

  • :=与=的区别

本篇内容将继续带领大家走进Go语言的世界。

1.本文简介

Go语言学习之力扣-删除有序数组中的重复项II

来源于:Leetcode80. 删除有序数组中的重复项 II

2.题目描述

给你一个有序数组nums,请你原地删除重复出现的元素,使每个元素最多出现两次

返回删除后数组的新长度

不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。

示例

输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 
并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 
不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 3 * 10410^4
  • -10410^4 <= nums[i] <= 10410^4
  • nums 已按升序排列

3.思路与方法

由题意最后只用输出新数组的长度

  • 我们可以利用遍历,设定两个开始节点;
  • 从数组第一个元素进行遍历,依次对比元素是否相同,将符合题目要求的元素往前移动;
  • 最后输出数组元素不同的那部分长度即可。

例如我们用一个例子来直观地说明:

1.初始数组num=[1,2,2,2]

2.设定两个起点进行遍历数组,因为题目要求使每个元素最多出现两次,所以此时我们设置节点的起始值 node=1,j=2,,即为num[node]=1,num[j]=2,

3.如果num[i]!=num[node-1],通过node++,使得node++的值等于此时i的值。 使得num[node]=num[i]

利用这样的方式,将同一个数组的符合要求的元素都往前移动。 最后输出节点node+1的长度即可

4.代码实现如下

func removeDuplicates(nums []int) int {
    node:=1
    for j :=2;j<len(nums);j++{
        if nums[j]!=nums[node-1]{
            node++
            nums[node]=nums[j]
        }
    }
    return node+1
}

输出为:

image.png

5.规律总结

我们由这道题浮想一下,如果题目继续改为:

给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素最多出现n

返回删除后数组的新长度

如果n=3,使每个元素最多出现n次,我们的代码可以修改为:

package main

import (
   "fmt"
)

func removeDuplicates(nums [6]int) int {
   node:=2
   for j :=3;j<len(nums);j++{
      if nums[j]!=nums[node-2]{
         node++
         nums[node]=nums[j]
      }
   }
   return node+1
}

func main(){
   a := [6]int{1,2,2,2,2,4}     
   fmt.Printf("使每个元素最多出现3次,返回删除后数组的新长度为:%v",removeDuplicates(a))
}

输入数组为:a=[1,2,2,2,2,4],使每个元素最多出现3次

经过函数

输出应该为:5

代码运行如下:

image.png

我们渐渐可以找到某种规律。 给你一个有序数组 nums ,请你原地删除重复出现的元素使每个元素最多出现n

返回删除后数组的新长度。

如果初始设定n是一个值

则我们的通用函数表达式可以为:

func removeDuplicates(nums []int) int {
    node:=n-1
    for j :=n;j<len(nums);j++{
        if nums[j]!=nums[node-(n-1)]{
            node++
            nums[node]=nums[j]
        }
    }
    return node+1
}

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。