Skip to main content

80 Remove Duplicates from Sorted Array II

Description

You are given a sorted list of integers. Your task is to modify the list in-place so that each unique element appears at most twice.

After the modification, return the new length of the list. The first k elements of the list should contain the allowed values, and the order should remain unchanged.

Elements beyond the first k positions can be ignored.

Do not allocate extra space for another array. You must do this by modifying the input array in-place with O(1) extra memory.


Example 1

Input: nums = [1,1,1,2,2,3]
Output: 5, nums = [1,1,2,2,3,_]

Example 2

Input: nums = [0,0,1,1,1,1,2,3,3]
Output: 7, nums = [0,0,1,1,2,3,3,_,_]

Constraints

  • 1 <= nums.length <= 3 * 10^4
  • -10^4 <= nums[i] <= 10^4
  • The input list is sorted in ascending order.

Start idx at 2 because the first two elements can always stay. Iterate from index 2 onwards. If current element is different from the element at idx - 2, the current element can appear without exceeding 2 occurrences. Copy it to nums[idx] and increase idx. Return idx which is the length.

Java

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

Kotlin

class Solution {
fun removeDuplicates(nums: IntArray): Int {
var idx = 2
for(i in 2 until nums.size) {
if(nums[i] != nums[idx - 2]) {
nums[idx++] = nums[i]
}
}
return idx
}
}

Scala

object Solution {
def removeDuplicates(nums: Array[Int]): Int = {
var idx = 2
for(i <- 2 until nums.length) {
if(nums(i) != nums(idx - 2)) {
nums(idx) = nums(i)
idx += 1
}
}
idx
}
}

Time Complexity: O(n)
Space Complexity: O(1)