zoukankan      html  css  js  c++  java
  • 【Remove Duplicates from Sorted Array II】cpp

    题目

    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].

    代码

    class Solution {
    public:
        int removeDuplicates(int A[], int n) {
            if (n <= 2) return n;
            int index = 2;
            for (int i=2 ; i<n; i++)
            {
                if ( A[index-2]!=A[i] )
                {
                    A[index++] = A[i];
                }
            }
            return index;
        }
    };

    Tips:

    1. index始终指向下一个要插入元素的位置

    2. 判断当前元素与index-2位置元素是否相等,如果不等就可以插入,保证没有连续三个相同的元素

    3. 这里用到些数学归纳法的技巧:

      a. 只要保证第1-第3个元素不是都相同的

      b. 并且再后面每一步添加元素的时候判断都不是相同的

     则可得结论一直到条件结束,调整后的数组中不会有三个连续重复的元素

    ========================================

    第二次过这道题卡住了一下,复习了第一次写的程式,改出了AC的代码。

    class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
                if ( nums.size()<3 ) return nums.size();
                int prev = 2;
                for ( int i=2; i<nums.size(); ++i )
                {
                    if ( nums[prev-2]!=nums[i] )
                    {
                        nums[prev++] = nums[i];
                    }
                }
                return prev;
        }
    };

    tips:

    这种数学归纳法之类的去重代码,可以总结出一定的规律

    第一个指针 prev = 可以保持的重复数量 (这个指针指示当前可插入的位置)

    第二个指针 i 从 可以保持重复数量下标开始 一直到数组长度最后

    去重条件判断nums[prev-可以保持重复的数量]!=nums[i]

    这样就可以获得满足题意的程式。

    ================================

    这里还有一种特殊的case,如果出现重复的就不要了呢?写出了下面的程式

    // special case
    class SolutionS{
        public:
            static int removeDuplicates(vector<int>& nums)
            {
                if ( nums.size()<2 ) return nums.size();
                int i=1;
                int prev = nums[0]!=nums[1] ? 1 : 0;
                while (i<nums.size()-1)
                {
                    if (nums[i]!=nums[i-1] && nums[i]!=nums[i+1])
                    {
                        nums[prev++]=nums[i];
                    }
                    i++;
                }
                if ( nums[i]!=nums[i-1] ) nums[prev++]=nums[i];
                return prev;
            }
    };

    这个程式是自己写的,自测了一些case。

    思路很朴素:

    1. 维护一个prev作为待插入的位置

    2. 判断一个元素与前后元素是否相等

    3. 处理第一个和末尾元素(第一个没有前驱,末尾没有后继,所以要特殊处理)

     ====================================================

    还有一种情况,如果数组不是排序的,就用hashtable记录每个数字出现的次数。

  • 相关阅读:
    自定义Visual Studio调试器中的对象显示方式
    Visual Studio中的主题定制变得更加容易
    宣布Visual Studio Code Installer for Java
    在Visual Studio 2019中开启预览功能
    .NET Core 3.0预览版7中的ASP.NET Core和Blazor更新
    C#连接SQL Anywhere 12 数据库
    数据库导出脚本
    python http请求及多线程应用
    记录 Ext 日历月份选择控件bug解决过程结果
    js浮点数运算封装, 起因财务部分精确计算
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4427570.html
Copyright © 2011-2022 走看看