zoukankan      html  css  js  c++  java
  • 【LeetCode & 剑指offer刷题】数组题6:26. Remove Duplicates from Sorted Array

    【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)

    26. Remove Duplicates from Sorted Array

    Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length.
    Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
    Example 1:
    Given nums = [1,1,2],
     
    Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively.
     
    It doesn't matter what you leave beyond the returned length.
    Example 2:
    Given nums = [0,0,1,1,1,2,2,3,3,4],
     
    Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively.
     
    It doesn't matter what values are set beyond the returned length.
    Clarification:
    Confused why the returned value is an integer but your answer is an array?
    Note that the input array is passed in by reference, which means modification to the input array will be known to the caller as well.
    Internally you can think of this:
    // nums is passed in by reference. (i.e., without making a copy)
    int len = removeDuplicates(nums);
     
    // any modification to nums in your function would be known by the caller.
    // using the length returned by your function, it prints the first len elements.
    for (int i = 0; i < len; i++) {
    print(nums[i]);
    }
     
    /*
    问题:去除有序序列中的重复数字
    方法一:双指针法(覆盖法)
    当a[i] != a[index-1] 用a[i]覆盖a[index]
    相等时不覆盖,不等时覆盖,index代表了新数组的索引,i代表了旧数组索引,将无重复数依次移动到前面
    如:
     1 2 2(index) 2 3(i) 3 4 5
    a[index] = a[i];
    index++;
    O(n),O(1)
    */
    class Solution
    {
    public:
        int removeDuplicates(vector<int>& a)
        {
            if(a.empty()) return 0;
           
            int index = 1; //初始时index和i指针均指向索引为1的位置
            for(int i =1; i < a.size(); i++) //用i指针扫描数组
            {
                if(a[i] != a[index-1]) //遇到不等数时,覆盖a[index],index++
                {
                    a[index] = a[i];
                    index++;
                } //index最后指向无重复序列末尾
            }
            return index; //返回无重复序列的长度
        }
    };
     
    80. Remove Duplicates from Sorted Array II
    描述:
    Follow up for ”Remove Duplicates”: What if duplicates are allowed at most twice?
    For example, Given sorted array A = [1,1,1,2,2,3],
    Your function should return length = 5, and A is now [1,1,2,2,3]
     
    /*
    覆盖法
    如:
    1 2 2 2(index) 3(i) 3 4 5
    a[index] = a[i];
    index++;
    O(n),O(1)
    */
    class Solution
    {
    public:
        int removeDuplicates(vector<int>& a)
        {
            int n = a.size();
            if(n <= 2) return n;
           
            int index = 2;
            for(int i = 2; i<n; i++)
            {
                if(a[i] != a[index - 2])
                {
                    a[index] = a[i];
                    index++;
                }
            }
            return index;
        }
    };
     
  • 相关阅读:
    C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制
    如何将CKeditor编辑器的上传和thinkphp结合
    在 VisualStudio 给文件起一个带分号的文件名会怎样
    dotnet ConditionalWeakTable 的底层原理
    GitHub 的 Action 判断仅在主仓库才执行脚本
    ASP.NET Core 将文件夹内容输出为压缩包文件方法
    dotnet Microsoft.Recognizers.Text 超强大的自然语言关键词提取库
    dotnet CBB 为什么决定推送 Tag 才能打包
    WPF 通过 InputManager 模拟调度触摸事件
    如何参与 .NET 的开发和设计
  • 原文地址:https://www.cnblogs.com/wikiwen/p/10224303.html
Copyright © 2011-2022 走看看