@@ -63,10 +63,22 @@ for (int i = 0; i < len; i++) {
63
63
64
64
<!-- 这里可写通用的实现逻辑 -->
65
65
66
- 原问题要求最多相同的数字最多出现 2 次,我们可以扩展至相同的数字最多保留 k 个。
66
+ ** 方法一:一次遍历 **
67
67
68
- - 由于相同的数字最多保留 k 个,那么原数组的前 k 个元素我们可以直接保留;
69
- - 对于后面的数字,能够保留的前提是:当前数字 num 与前面已保留的数字的倒数第 k 个元素比较,不同则保留,相同则跳过。
68
+ 我们用一个变量 $k$ 记录当前已经处理好的数组的长度,初始时 $k=0$,表示空数组。
69
+
70
+ 然后我们从左到右遍历数组,对于遍历到的每个元素 $x$,如果 $k \lt 2$ 或者 $x \neq nums[ k-2] $,我们就将 $x$ 放到 $nums[ k] $ 的位置,然后 $k$ 自增 $1$。否则,$x$ 与 $nums[ k-2] $ 相同,我们直接跳过这个元素。继续遍历,直到遍历完整个数组。
71
+
72
+ 这样,当遍历结束时,$nums$ 中前 $k$ 个元素就是我们要求的答案,且 $k$ 就是答案的长度。
73
+
74
+ 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
75
+
76
+ 补充:
77
+
78
+ 原问题要求最多相同的数字最多出现 $2$ 次,我们可以扩展至相同的数字最多保留 $k$ 个。
79
+
80
+ - 由于相同的数字最多保留 $k$ 个,那么原数组的前 $k$ 个元素我们可以直接保留;
81
+ - 对于后面的数字,能够保留的前提是:当前数字 $x$ 与前面已保留的数字的倒数第 $k$ 个元素比较,不同则保留,相同则跳过。
70
82
71
83
相似题目:[ 26. 删除有序数组中的重复项] ( /solution/0000-0099/0026.Remove%20Duplicates%20from%20Sorted%20Array/README.md )
72
84
@@ -79,12 +91,12 @@ for (int i = 0; i < len; i++) {
79
91
``` python
80
92
class Solution :
81
93
def removeDuplicates (self , nums : List[int ]) -> int :
82
- i = 0
83
- for num in nums:
84
- if i < 2 or num != nums[i - 2 ]:
85
- nums[i ] = num
86
- i += 1
87
- return i
94
+ k = 0
95
+ for x in nums:
96
+ if k < 2 or x != nums[k - 2 ]:
97
+ nums[k ] = x
98
+ k += 1
99
+ return k
88
100
```
89
101
90
102
### ** Java**
@@ -94,13 +106,13 @@ class Solution:
94
106
``` java
95
107
class Solution {
96
108
public int removeDuplicates (int [] nums ) {
97
- int i = 0 ;
98
- for (int num : nums) {
99
- if (i < 2 || num != nums[i - 2 ]) {
100
- nums[i ++ ] = num ;
109
+ int k = 0 ;
110
+ for (int x : nums) {
111
+ if (k < 2 || x != nums[k - 2 ]) {
112
+ nums[k ++ ] = x ;
101
113
}
102
114
}
103
- return i ;
115
+ return k ;
104
116
}
105
117
}
106
118
```
@@ -111,29 +123,44 @@ class Solution {
111
123
class Solution {
112
124
public:
113
125
int removeDuplicates(vector<int >& nums) {
114
- int i = 0;
115
- for (int& num : nums)
116
- if (i < 2 || num != nums[ i - 2] )
117
- nums[ i++] = num;
118
- return i;
126
+ int k = 0;
127
+ for (int x : nums) {
128
+ if (k < 2 || x != nums[ k - 2] ) {
129
+ nums[ k++] = x;
130
+ }
131
+ }
132
+ return k;
119
133
}
120
134
};
121
135
```
122
136
137
+ ### **Go**
138
+
139
+ ```go
140
+ func removeDuplicates(nums []int) int {
141
+ k := 0
142
+ for _, x := range nums {
143
+ if k < 2 || x != nums[k-2] {
144
+ nums[k] = x
145
+ k++
146
+ }
147
+ }
148
+ return k
149
+ }
150
+ ```
151
+
123
152
### ** C#**
124
153
125
154
``` cs
126
155
public class Solution {
127
156
public int RemoveDuplicates (int [] nums ) {
128
- int i = 0;
129
- foreach(int num in nums)
130
- {
131
- if (i < 2 || num != nums[i - 2])
132
- {
133
- nums[i++] = num;
157
+ int k = 0 ;
158
+ foreach (int x in nums ) {
159
+ if (k < 2 || x != nums [k - 2 ]) {
160
+ nums [k ++ ] = x ;
134
161
}
135
162
}
136
- return i ;
163
+ return k ;
137
164
}
138
165
}
139
166
```
@@ -146,44 +173,29 @@ public class Solution {
146
173
* @return {number}
147
174
*/
148
175
var removeDuplicates = function (nums ) {
149
- let i = 0 ;
150
- for (const num of nums) {
151
- if (i < 2 || num != nums[i - 2 ]) {
152
- nums[i ++ ] = num ;
176
+ let k = 0 ;
177
+ for (const x of nums) {
178
+ if (k < 2 || x !== nums[k - 2 ]) {
179
+ nums[k ++ ] = x ;
153
180
}
154
181
}
155
- return i ;
182
+ return k ;
156
183
};
157
184
```
158
185
159
- ### ** Go**
160
-
161
- ``` go
162
- func removeDuplicates (nums []int ) int {
163
- i := 0
164
- for _ , num := range nums {
165
- if i < 2 || num != nums[i-2 ] {
166
- nums[i] = num
167
- i++
168
- }
169
- }
170
- return i
171
- }
172
- ```
173
-
174
186
### ** Rust**
175
187
176
188
``` rust
177
189
impl Solution {
178
190
pub fn remove_duplicates (nums : & mut Vec <i32 >) -> i32 {
179
- let mut len = 0 ;
191
+ let mut k = 0 ;
180
192
for i in 0 .. nums . len () {
181
- if i < 2 || nums [i ] != nums [len - 2 ] {
182
- nums [len ] = nums [i ];
183
- len += 1 ;
193
+ if k < 2 || nums [i ] != nums [k - 2 ] {
194
+ nums [k ] = nums [i ];
195
+ k += 1 ;
184
196
}
185
197
}
186
- len as i32
198
+ k as i32
187
199
}
188
200
}
189
201
```
0 commit comments