zoukankan      html  css  js  c++  java
  • OJ练习11——T26 Remove Duplicates from Sorted Array

    删除已排序数组的重复元素,返回数组处理后的新长度。

    要求空间复杂度为1.

    【思路】

    一道水题,折腾了一个多小时。

    1)原来的思路:从后向前遍历元素,遇到和前一个相同的则记为一个不可能的数(比如A[0]-1,假设是0),

    然后从前向后遍历,两个标记,遇到0就不复制。在这个地方遇到问题,总是出错?

    【更新】见下my code。繁琐了些,但是可以用。

    2)key保存要复制的值,一个标记start边遍历边计数。

    和key不同的,就把key放入start,start指向下一个,key赋新值。

    和key相同的,do nothing,继续向下遍历

    (多么顺的思路,还是做得题太少)

    【other code】

    int removeDuplicates(int A[], int n) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            if (n == 0)
                return 0;
                
            int start = 0;
            int key = A[0];
            for(int i = 0; i < n; i++)
                if (A[i] != key)
                {
                    A[start++] = key;
                    key = A[i];                
                }
                
            A[start++] = key;
            
            return start;
        
    }

    【my code】

    int removeduplicate(int A[], int n)
    {
        //为什么不覆盖
        int length=n;
        int unavailable=A[0]-1;
        for(int i=n-1; i>0; i--)
            if(A[i]==A[i-1]){
                length--;
                A[i]=unavailable;
            }
        int j=1;
        for(int i=1; i<n&&j<length; i++){
            if(A[i]!=unavailable){
                A[j++]=A[i];
            }        
        }
        return length;
    }

    【总结】

    只要考虑一种情况就可以:何时保留。

    不需要考虑重复时该怎么处理,只要控制了保留就能覆盖掉。

  • 相关阅读:
    第一篇博客
    Word2vec负采样
    Ubuntu系统为应用建立桌面快捷方式(以Pycharm为例)
    Kaggle入门Titanic——模型建立
    Kaggle入门Titanic——特征工程
    ubuntu系统theano和keras的安装
    win7系统下python安装numpy,matplotlib,scipy和scikit-learn
    ubuntu14.04环境下spyder的安装
    防止IE7,8进入怪异模式
    自定义列表
  • 原文地址:https://www.cnblogs.com/ketchups-notes/p/4421356.html
Copyright © 2011-2022 走看看