如何改进删除重复算法?

时间:2015-07-17 04:14:28

标签: python algorithm

我的采访问题是我需要返回删除重复项的数组的长度,但我们最多可以留下2个副本。

例如,[1, 1, 1, 2, 2, 3]新数组将为[1, 1, 2, 2, 3]。所以新的长度将是5.我想出了一个带O(2n)的算法。我怎样才能将其提高到最快。

def removeDuplicates(nums):
    if nums is None:
        return 0

    if len(nums) == 0:
        return 0

    if len(nums) == 1:
        return 1

    new_array = {}
    for num in nums:
        new_array[num] = new_array.get(num, 0) + 1

    new_length = 0
    for key in new_array:
        if new_array[key] > 2:
            new_length = new_length + 2
        else:
            new_length = new_length + new_array[key]

    return new_length

new_length = removeDuplicates([1, 1, 1, 2, 2, 3])
assert new_length == 5

我的第一个问题是我的算法是否正确?

5 个答案:

答案 0 :(得分:1)

你的逻辑是正确的,但是他是一个更简单的方法来达到你在问题中提到的目标。

这是我的逻辑。

myl = [1, 1, 1, 2, 2, 3, 1, 1, 1, 2, 2, 3, 1, 1, 1, 2, 2, 3]

newl = []

for i in myl:
    if newl.count(i) != 2:
        newl.append(i)

print newl
[1, 1, 2, 2, 3, 3]

希望这有帮助。

答案 1 :(得分:1)

如果原始数组大小为n

  1. 计算数组中的不同数字。

  2. 如果您有d个不同的数字,那么您的答案将是

     d        (when n == d)
     d+1      (when n == d+1)
     d+2      (when n >= d+2)
    
  3. 如果数组中的所有数字都小于n-1,您甚至可以在不使用任何额外空间的情况下解决此问题。如果是这种情况,请检查this并且您可以非常轻松地计算不同的数字,而无需使用额外的空间。

答案 2 :(得分:1)

我忘了生成新数组,只关注计数:

from collections import Counter

def count_non_2dups(nums):
    new_len = 0
    for num, count in Counter(nums).items():
        new_len += min(2, count)
    return new_len

答案 3 :(得分:0)

int removeDuplicates(vector<int>& nums) {
    if (nums.size() == 0) return nums.size();
    int state = 1;
    int idx = 1;
    for (int i = 1; i < nums.size(); ++i) {
        if (nums[i] != nums[i-1]) {
            state = 1;
            nums[idx++] = nums[i];
        }
        else if (state == 1) {
            state++;
            nums[idx++] = nums[i];
        }
        else {
            state++;
        }
    }
    return idx;
}

想法:保持记录当前重复次数的变量(状态)(更准确地说,状态记录与当前元素左边相邻的元素的重复次数)。该算法为O(n),对阵列进行一次扫描。

答案 4 :(得分:0)

def removeDuplicates(nums):
    if nums is None:
        return 0

    if len(nums) == 0:
        return 0

    if len(nums) == 1:
        return 1

    new_array_a = set()
    new_array_b = set()
    while nums:
        i = nums.pop()
        if i not in new_array_a:
            new_array_a.add(i)
        elif i not in new_array_b:
            new_array_b.add(i)

    return len(new_array_a) + len(new_array_b)