Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place such that each unique element appears only once. Return the number of unique elements k. The first k elements of nums must contain the unique elements in sorted order.

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

Contents

Slow/Fast Two Pointers

slow marks the position to place the next unique element. fast scans through the array to find new unique values.

public int removeDuplicates(int[] nums) { int slow = 0; for (int fast = 1; fast < nums.length; fast++) { if (nums[fast] != nums[slow]) { slow++; nums[slow] = nums[fast]; // place next unique element } // else: duplicate — fast moves forward, slow stays } return slow + 1; // number of unique elements }
Trace through Example 2: nums = [0,0,1,1,1,2,2,3,3,4]
fastnums[fast]nums[slow]Actionslow
100duplicate, skip0
210new → slow=1, nums[1]=11
311duplicate, skip1
411duplicate, skip1
521new → slow=2, nums[2]=22
622duplicate, skip2
732new → slow=3, nums[3]=33
833duplicate, skip3
943new → slow=4, nums[4]=44

Return slow + 1 = 5. First 5 elements: [0,1,2,3,4].