zoukankan      html  css  js  c++  java
  • 删除排序数组中的重复项的golang实现

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

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

    给定数组 nums = [1,1,2], 
    
    函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 
    
    你不需要考虑数组中超出新长度后面的元素。
    
    给定 nums = [0,0,1,1,1,2,2,3,3,4],
    
    函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
    
    你不需要考虑数组中超出新长度后面的元素。

    首先理解题意:

    1. 当给定数组为空的时候就应该返回0
    2. 而且不能引入其他数组空间,那就是不能再使用一个新的数组来存放结果
    3. 还要不重复,数组中超出新长度后面的元素无视

    那我们就可以用快慢指针的思想来解答这道题了

    1. 给定两个游标left和right
    2. 当给定数组的下标为left和right的值一样的话,就不管
    3. 当不一样的话,那我们就要做一个操作,就是把当前right下标的值给到left下一个下标
    具体代码:
    func removeDuplicates(nums []int) int {
        //如果是空切片,那就返回0
        if len(nums) == 0 {
            return 0
        }
        //用两个标记来比较相邻位置的值
        //当一样的话,那就不管继续
        //当不一样的时候,就把right指向的值赋值给left下一位
        left, right := 0, 1
        for ; right < len(nums); right++ {
            if nums[left] == nums[right] {
                continue
            }
            left++
            nums[left] = nums[right]
        }
        fmt.Println(nums[:left+1])
        return left + 1
    }
  • 相关阅读:
    P1121 环状最大两段子段和
    无题
    cdoj 1485 柱爷搞子串 sam treap
    自然数幂和
    Gym 100341C AVL Trees NTT
    线性筛分解质因子
    codeforces 366 Ant Man dp
    UVALive 6914 Maze Mayhem 轮廓线dp
    hdu 5790 Prefix 字典树 主席树
    莫比乌斯反演个人小结
  • 原文地址:https://www.cnblogs.com/TimLiuDream/p/9991857.html
Copyright © 2011-2022 走看看