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;
}

【总结】

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

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

posted on 2015-04-13 09:35  EmmaLi  阅读(119)  评论(0编辑  收藏  举报

导航