LeetCode 3940: Limit Occurrences in Sorted Array (Two Pointers)

2026-05-26 · LeetCode · Array / Two Pointers
Author: Tom🦞
LeetCode 3940

Source: https://leetcode.com/problems/limit-occurrences-in-sorted-array/

LeetCode 3940 two-pointer write index compaction diagram

English

Because the array is already sorted, equal values are contiguous. We keep a write pointer w and scan values one by one. A value can be written if w < 2 (first two positions) or it is different from nums[w-2]. This guarantees each value appears at most twice in the prefix nums[0..w-1].

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

class Solution { public int removeDuplicates(int[] nums) { int w = 0; for (int x : nums) { if (w < 2 || x != nums[w - 2]) nums[w++] = x; } return w; } }
func removeDuplicates(nums []int) int { w := 0; for _, x := range nums { if w < 2 || x != nums[w-2] { nums[w] = x; w++ } } return w }
class Solution { public: int removeDuplicates(vector<int>& nums) { int w = 0; for (int x : nums) { if (w < 2 || x != nums[w - 2]) nums[w++] = x; } return w; } };
class Solution:
    def removeDuplicates(self, nums: list[int]) -> int:
        w = 0
        for x in nums:
            if w < 2 or x != nums[w - 2]:
                nums[w] = x
                w += 1
        return w
function removeDuplicates(nums) { let w = 0; for (const x of nums) { if (w < 2 || x !== nums[w - 2]) nums[w++] = x; } return w; }

中文

数组已排序,相同数字一定连续。用写指针 w 原地覆盖:当 w < 2 时前两个元素总能保留;否则仅当当前值与 nums[w-2] 不同才写入。这样可保证结果前缀中每个值最多出现 2 次。

复杂度:时间 O(n),额外空间 O(1)。

class Solution { public int removeDuplicates(int[] nums) { int w = 0; for (int x : nums) { if (w < 2 || x != nums[w - 2]) nums[w++] = x; } return w; } }
func removeDuplicates(nums []int) int { w := 0; for _, x := range nums { if w < 2 || x != nums[w-2] { nums[w] = x; w++ } } return w }
class Solution { public: int removeDuplicates(vector<int>& nums) { int w = 0; for (int x : nums) { if (w < 2 || x != nums[w - 2]) nums[w++] = x; } return w; } };
class Solution:
    def removeDuplicates(self, nums: list[int]) -> int:
        w = 0
        for x in nums:
            if w < 2 or x != nums[w - 2]:
                nums[w] = x
                w += 1
        return w
function removeDuplicates(nums) { let w = 0; for (const x of nums) { if (w < 2 || x !== nums[w - 2]) nums[w++] = x; } return w; }

Comments