Remove Duplicates From Sorted Array
Given an integer array numsnums
Consider the number of unique elements of numsk
-
Change the array
such that the firstnums elements ofk contain the unique elements in the order they were present innums initially. The remaining elements ofnums are not important as well as the size ofnums .nums -
Return
.k
Custom Judge:
The judge will test your solution with the following code:
int[] nums = [...]; // Input array
int[] expectedNums = [...]; // The expected answer with correct length
int k = removeDuplicates(nums); // Calls your implementation
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
If all assertions pass, then your solution will be accepted.
Example 1
Output: 2, nums = [1,2,_]
Explanation: Your function should return k = 2, with the first two elements of nums being 1 and 2 respectively.
It does not matter what you leave beyond the returned k (hence they are underscores).
Example 2
Output: 5, nums = [0,1,2,3,4,_,_,_,_,_]
Explanation: Your function should return k = 5, with the first five elements of nums being 0, 1, 2, 3, and 4 respectively.
It does not matter what you leave beyond the returned k (hence they are underscores).
Constraints:
1 <= nums.length <= 3 * 104-100 <= nums[i] <= 100 is sorted in non-decreasing order.nums
Solution 1 - Move distinct elements to the front of array
In this approach, we will move the distinct elements to the front of the array and ignore remaining.
Implementation steps:
-
We will create two variables
to track the index ofdupIndex array where to move distinct elements to, andnums to track current indexed element to check whether next coming elements are duplicates or not.prevElement -
We will initialize
, since element at 0th index will not have any elements before that, anddupIndex =1 .prevElement = nums[0] -
Then, we will loop through elements of
array from 1st index and check ifnums is not same asnums[i] , that means they are not duplicates, so move element at indexprevElement toi and incrementdupIndex , and update thedupIndex with current value. If the current element is same asprevElement then continue the loop.prevElement -
Finally, return
, it will be at the position where all distinct elements are moved to its left side.dupIndex
Example: consider below input nums = [1,1,2,3]
nums = [1,1,2,3]-
As a first step, we will initialize
anddupIndex = 1 .prevElement = nums[0] = 1 -
Now, loop through
array from index 1.nums -
Element at 1st index = 1, is same as
, so we continue to next element.prevElement -
Element at 2nd index = 2, is not same as
(2 ≠ 1):prevElement-
So, we update
with current value,prevElementprevElement = 2 -
Move current indexed element to
, so the resultant array looks like below:dupIndex
-
Now, increment
to 2.dupIndex
-
So, we update
-
Element at 3rd index = 3, is not same as
(3 ≠ 2):prevElement-
So, we update
with current value,prevElementprevElement = 3 -
Move current indexed element to
, so the resultant array looks like below:dupIndex
-
Now, increment
to 3.dupIndex
-
So, we update
-
At the end, we will simply return the
, this represents the the index where it left off, and that is also the length of distinct elements size.dupIndex
public class RemoveDuplicatesFromSortedArray {
static int removeDuplicates(int[] nums) {
int dupIndex = 1;
int prevElement = nums[0];
for(int i=1; i<nums.length; i++) {
if(nums[i] != prevElement) {
prevElement = nums[i];
nums[dupIndex++] = nums[i];
}
}
return dupIndex;
}
public static void main(String[] args) {
System.out.println(removeDuplicates(new int[]{1, 1, 2}));
System.out.println(removeDuplicates(new int[]{0,0,1,1,1,2,2,3,3,4}));
}
}
Complexity Analysis:
Time complexity: Above code runs in O(n) time where nnums
Space complexity: O(1).
Above implementations source code can be found at