Remove Duplicates from Sorted Array — Two Pointer O(n) [Easy]

Sanjeev SharmaSanjeev Sharma
3 min read

Advertisement

Problem Statement

Given a sorted integer array nums, remove duplicates in-place so each unique element appears only once. Return the count k of unique elements. The first k elements of nums must contain the unique elements in order.

Example:

Input:  [1, 1, 2]          → k=2, nums=[1, 2, _]
Input:  [0,0,1,1,1,2,2,3,3,4] → k=5, nums=[0,1,2,3,4,_,_,_,_,_]

Intuition

Write pointer: write tracks where to place the next unique element. Since the array is sorted, duplicates are adjacent. Walk read through the array; advance write only when nums[read] != nums[write-1].

write = 1   (first element is always unique)
for read = 1 to n-1:
    if nums[read] != nums[write-1]:
        nums[write] = nums[read]
        write++
return write

Solutions in All 5 Languages

C

int removeDuplicates(int* nums, int numsSize) {
    if (numsSize == 0) return 0;
    int write = 1;
    for (int read = 1; read < numsSize; read++) {
        if (nums[read] != nums[write-1]) {
            nums[write++] = nums[read];
        }
    }
    return write;
}

C++

#include <vector>
using namespace std;

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if (nums.empty()) return 0;
        int write = 1;
        for (int i = 1; i < (int)nums.size(); i++) {
            if (nums[i] != nums[write-1]) {
                nums[write++] = nums[i];
            }
        }
        return write;
    }
};

Java

class Solution {
    public int removeDuplicates(int[] nums) {
        int write = 1;
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] != nums[write-1]) {
                nums[write++] = nums[i];
            }
        }
        return write;
    }
}

JavaScript

function removeDuplicates(nums) {
    let write = 1;
    for (let i = 1; i < nums.length; i++) {
        if (nums[i] !== nums[write-1]) {
            nums[write++] = nums[i];
        }
    }
    return write;
}

Python

from typing import List

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        write = 1
        for i in range(1, len(nums)):
            if nums[i] != nums[write - 1]:
                nums[write] = nums[i]
                write += 1
        return write

Follow-up — Allow At Most K Duplicates (LeetCode 80)

def removeDuplicatesII(nums, k=2):
    write = 0
    for num in nums:
        # Allow if write < k or current != the k-th-last written element
        if write < k or num != nums[write - k]:
            nums[write] = num
            write += 1
    return write

Elegant generalization: nums[write-k] is the k-th last placed element. If current equals it, we already have k copies → skip.

Complexity: O(n) time, O(1) space

Next: Problem 9 — Single Number (XOR trick)

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro