Remove Duplicates from Sorted Array — Two Pointer O(n) [Easy]
Advertisement
Problem Statement
Given a sorted integer array
nums, remove duplicates in-place so each unique element appears only once. Return the countkof unique elements. The firstkelements ofnumsmust 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
- Solutions in All 5 Languages
- C
- C++
- Java
- JavaScript
- Python
- Follow-up — Allow At Most K Duplicates (LeetCode 80)
- Complexity: O(n) time, O(1) space
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
Advertisement