zoukankan      html  css  js  c++  java
  • 【leetcode】Remove Duplicates from Sorted Array I & II(middle)

    Given a sorted array, 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 in place with constant memory.

    For example,
    Given input array A = [1,1,2],

    Your function should return length = 2, and A is now [1,2].

    思路:

    我用两个游标分别记录新数组的下一个位置newpos和原数组要判断的下一个位置pos。如果pos位置的数字和newpos - 1 的一样则跳过

    关键:比较是否一样时与新的数组的目前最后一个数字比。

    int removeDuplicates(int A[], int n) {
            if(n == 0) return 0;
            int newpos = 1, pos = 1;
            while(pos < n)
            {
                if(A[pos] == A[newpos - 1]) pos++;
                else A[newpos++] = A[pos++];
            }
            return newpos;
        }

    大神超短的代码:

    int count = 0;
    for(int i = 1; i < n; i++){
        if(A[i] == A[i-1]) count++;
        else A[i-count] = A[i];
    }
    return n-count;

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

    允许两个重复的

    思路:与上面其实都一样,就是把判断条件改为与上两个数字相同就跳过。注意,要与新数组最后两个数字比较。

    int removeDuplicatesTwice(int A[], int n) {
            if(n <= 2) return n;
            int pos = 2; //新数组的下一个判断位置
            for(int i = 2; i < n; i++)
            {
                if(!(A[i] == A[pos - 1] && A[i] == A[pos - 2])) //这里是关键,要和pos-1 和 pos-2比较。pos对应的出现两次才是真的两次了。不能和i-1和i-2比,因为可能在前面这两个位置的数字已经改变了。
                {
                    A[pos++] = A[i];
                }
            }
            return pos;
        }

    有人写了一个问题泛化到可以重复k次的代码:

    int removeDuplicates(int A[], int n, int k) {
                if (n <= k) return n;
                int i = 1, j = 1;
                int cnt = 1;
                while (j < n) {
                    if (A[j] != A[j-1]) { //其实我觉得这里写成A[j] != A[i - 1] 更好
                        cnt = 1;
                        A[i++] = A[j];
                    }
                    else {
                        if (cnt < k) {
                            A[i++] = A[j];
                            cnt++;
                        }
                    }
                    ++j;
                }
                return i;
    }
  • 相关阅读:
    this is a test from windows live writer 11529
    RoR部署方案深度剖析 (转载自javaeye)
    Rails每周一题(六): Security Guide(上) (转载)
    让你大脑变冷静的28句英文
    REST on Rails之自定义路由
    REST on Rails之资源嵌套
    #### 高薪 ##招聘:。。。。。 待遇非常不错。
    JavaEye网站的RoR性能优化经验谈 (转载)
    网页打印的分页问题
    Ruby Metaclass详解
  • 原文地址:https://www.cnblogs.com/dplearning/p/4408964.html
Copyright © 2011-2022 走看看