Remove Duplicates from an Array

Apr 4, 2019 by Sree Prasad

Description

Given a sorted array of integers nums and a positive integer n, remove the duplicates in-place (without allocating extra memory) such that there are at most max_count occurrences of that number in the array. Return the new length of the array with the duplicates removed.

Example:
>>> nums = [1,2,2,2,3,4,4]
>>> max_count = 2
>>> remove_duplicates(nums, max_count)
6
>>> nums
[1,2,2,3,4,4,4]

After the function runs, the value returned is 6 and the contents of the input array are [1,2,2,3,4,4,x] where ‘x’ could be anything. In the example above, it is ‘4’


Solution

Here is one possible solution to the problem. We iterate through nums keeping track of the numbers we removed as offset (meaning the index offset) and the number of times we’ve seen the number at the current index as count. When we encounter consecutive elements that are equal, we increase the count. When they’re not equal, we reset the count to 1. If the count is greater than max_count, then we “remove” it by increasing the offset and overwriting the value at index i - offset.

def remove_duplicates(nums, max_count):
    offset = 0
    count = 1

    for i in range(1, len(nums)):
        if nums[i] == nums[i - 1]:
            count += 1
        else:
            count = 1

        if count > max_count:
            offset += 1

        nums[i - offset] = nums[i]

    return len(nums) - offset

The runtime is O(n), where n is the number of elements in the array nums.