leetcode/
dedup.rs

1//! # 80. 删除排序数组中的重复项 II
2//!
3//! 难度 中等
4//!
5//! 给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
6//!
7//! 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
8//!
9//!
10//!
11//! ## 说明:
12//!
13//! 为什么返回数值是整数,但输出的答案是数组呢?
14//!
15//! 请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
16//!
17//! 你可以想象内部操作如下:
18//!
19//! ```c
20//! // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
21//! int len = removeDuplicates(nums);
22//!
23//! // 在函数里修改输入数组对于调用者是可见的。
24//! // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
25//! for (int i = 0; i < len; i++) {
26//!     print(nums[i]);
27//! }
28//! ```
29//!
30//!
31//! ## 示例 1:
32//!
33//! ```plain
34//! 输入:nums = [1,1,1,2,2,3]
35//! 输出:5, nums = [1,1,2,2,3]
36//! 解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 你不需要考虑数组中超出新长度后面的元素。
37//! ```
38//!
39//! ## 示例 2:
40//!
41//! ```plain
42//! 输入:nums = [0,0,1,1,1,1,2,3,3]
43//! 输出:7, nums = [0,0,1,1,2,3,3]
44//! 解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3 。 你不需要考虑数组中超出新长度后面的元素。
45//! ```
46//!
47//!
48//! ## 提示:
49//!
50//! - `0 <= nums.length <= 3 * 104`
51//! - `-104 <= nums[i] <= 104`
52//! - `nums` 按递增顺序排列
53//!
54//! See [leetcode](https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/)
55
56pub struct Solution;
57impl Solution {
58    pub fn remove_duplicates(nums: &mut Vec<i32>) -> i32 {
59        let len = nums.len();
60        if len <= 2 {
61            return len as i32;
62        }
63
64        let mut cnt = 1;
65        let mut index = 1;
66        for i in 1..len {
67            if nums[i] == nums[i - 1] {
68                cnt += 1;
69            } else {
70                cnt = 1;
71            }
72            if cnt <= 2 {
73                nums[index] = nums[i];
74                index += 1;
75            }
76        }
77
78        nums.truncate(index);
79        index as i32
80    }
81
82    /// Use `Vec<_>::dedup_by()`
83    pub fn remove_duplicates_dedup(nums: &mut Vec<i32>) -> i32 {
84        let len = nums.len();
85        if len <= 2 {
86            return len as i32;
87        }
88
89        let mut cnt = 1;
90        nums.dedup_by(|a, b| {
91            cnt = if a == b { cnt + 1 } else { 1 };
92            cnt > 2
93        });
94        nums.len() as i32
95    }
96}