Skip to content

Commit 4e5d8e5

Browse files
committed
feat: add solutions to lc problem: No.0080
No.0080.Remove Duplicates from Sorted Array II
1 parent 9c83904 commit 4e5d8e5

File tree

10 files changed

+153
-139
lines changed

10 files changed

+153
-139
lines changed

solution/0000-0099/0026.Remove Duplicates from Sorted Array/README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,12 @@ for (int i = 0; i < k; i++) {
6767

6868
我们用一个变量 $k$ 记录当前已经处理好的数组的长度,初始时 $k=0$,表示空数组。
6969

70-
然后我们从左到右遍历数组,对于遍历到的每个元素 $x$,如果 $k=0$ 或者 $x \neq nums[k-1]$,我们就将 $x$ 放到 $nums[k]$ 的位置,然后 $k$ 自增 1。否则,$x$ 与 $nums[k-1]$ 相同,我们直接跳过这个元素。继续遍历,直到遍历完整个数组。
70+
然后我们从左到右遍历数组,对于遍历到的每个元素 $x$,如果 $k=0$ 或者 $x \neq nums[k-1]$,我们就将 $x$ 放到 $nums[k]$ 的位置,然后 $k$ 自增 $1$。否则,$x$ 与 $nums[k-1]$ 相同,我们直接跳过这个元素。继续遍历,直到遍历完整个数组。
7171

7272
这样,当遍历结束时,$nums$ 中前 $k$ 个元素就是我们要求的答案,且 $k$ 就是答案的长度。
7373

74+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
75+
7476
补充:
7577

7678
原问题要求最多相同的数字最多出现 $1$ 次,我们可以扩展至相同的数字最多保留 $k$ 个。

solution/0000-0099/0080.Remove Duplicates from Sorted Array II/README.md

+63-51
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,22 @@ for (int i = 0; i < len; i++) {
6363

6464
<!-- 这里可写通用的实现逻辑 -->
6565

66-
原问题要求最多相同的数字最多出现 2 次,我们可以扩展至相同的数字最多保留 k 个。
66+
**方法一:一次遍历**
6767

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$ 个元素比较,不同则保留,相同则跳过。
7082

7183
相似题目:[26. 删除有序数组中的重复项](/solution/0000-0099/0026.Remove%20Duplicates%20from%20Sorted%20Array/README.md)
7284

@@ -79,12 +91,12 @@ for (int i = 0; i &lt; len; i++) {
7991
```python
8092
class Solution:
8193
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
88100
```
89101

90102
### **Java**
@@ -94,13 +106,13 @@ class Solution:
94106
```java
95107
class Solution {
96108
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;
101113
}
102114
}
103-
return i;
115+
return k;
104116
}
105117
}
106118
```
@@ -111,29 +123,44 @@ class Solution {
111123
class Solution {
112124
public:
113125
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;
119133
}
120134
};
121135
```
122136
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+
123152
### **C#**
124153

125154
```cs
126155
public class Solution {
127156
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;
134161
}
135162
}
136-
return i;
163+
return k;
137164
}
138165
}
139166
```
@@ -146,44 +173,29 @@ public class Solution {
146173
* @return {number}
147174
*/
148175
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;
153180
}
154181
}
155-
return i;
182+
return k;
156183
};
157184
```
158185

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-
174186
### **Rust**
175187

176188
```rust
177189
impl Solution {
178190
pub fn remove_duplicates(nums: &mut Vec<i32>) -> i32 {
179-
let mut len = 0;
191+
let mut k = 0;
180192
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;
184196
}
185197
}
186-
len as i32
198+
k as i32
187199
}
188200
}
189201
```

solution/0000-0099/0080.Remove Duplicates from Sorted Array II/README_EN.md

+48-48
Original file line numberDiff line numberDiff line change
@@ -67,26 +67,26 @@ It does not matter what you leave beyond the returned k (hence they are undersco
6767
```python
6868
class Solution:
6969
def removeDuplicates(self, nums: List[int]) -> int:
70-
i = 0
71-
for num in nums:
72-
if i < 2 or num != nums[i - 2]:
73-
nums[i] = num
74-
i += 1
75-
return i
70+
k = 0
71+
for x in nums:
72+
if k < 2 or x != nums[k - 2]:
73+
nums[k] = x
74+
k += 1
75+
return k
7676
```
7777

7878
### **Java**
7979

8080
```java
8181
class Solution {
8282
public int removeDuplicates(int[] nums) {
83-
int i = 0;
84-
for (int num : nums) {
85-
if (i < 2 || num != nums[i - 2]) {
86-
nums[i++] = num;
83+
int k = 0;
84+
for (int x : nums) {
85+
if (k < 2 || x != nums[k - 2]) {
86+
nums[k++] = x;
8787
}
8888
}
89-
return i;
89+
return k;
9090
}
9191
}
9292
```
@@ -97,29 +97,44 @@ class Solution {
9797
class Solution {
9898
public:
9999
int removeDuplicates(vector<int>& nums) {
100-
int i = 0;
101-
for (int& num : nums)
102-
if (i < 2 || num != nums[i - 2])
103-
nums[i++] = num;
104-
return i;
100+
int k = 0;
101+
for (int x : nums) {
102+
if (k < 2 || x != nums[k - 2]) {
103+
nums[k++] = x;
104+
}
105+
}
106+
return k;
105107
}
106108
};
107109
```
108110
111+
### **Go**
112+
113+
```go
114+
func removeDuplicates(nums []int) int {
115+
k := 0
116+
for _, x := range nums {
117+
if k < 2 || x != nums[k-2] {
118+
nums[k] = x
119+
k++
120+
}
121+
}
122+
return k
123+
}
124+
```
125+
109126
### **C#**
110127

111128
```cs
112129
public class Solution {
113130
public int RemoveDuplicates(int[] nums) {
114-
int i = 0;
115-
foreach(int num in nums)
116-
{
117-
if (i < 2 || num != nums[i - 2])
118-
{
119-
nums[i++] = num;
131+
int k = 0;
132+
foreach (int x in nums) {
133+
if (k < 2 || x != nums[k - 2]) {
134+
nums[k++] = x;
120135
}
121136
}
122-
return i;
137+
return k;
123138
}
124139
}
125140
```
@@ -132,44 +147,29 @@ public class Solution {
132147
* @return {number}
133148
*/
134149
var removeDuplicates = function (nums) {
135-
let i = 0;
136-
for (const num of nums) {
137-
if (i < 2 || num != nums[i - 2]) {
138-
nums[i++] = num;
150+
let k = 0;
151+
for (const x of nums) {
152+
if (k < 2 || x !== nums[k - 2]) {
153+
nums[k++] = x;
139154
}
140155
}
141-
return i;
156+
return k;
142157
};
143158
```
144159

145-
### **Go**
146-
147-
```go
148-
func removeDuplicates(nums []int) int {
149-
i := 0
150-
for _, num := range nums {
151-
if i < 2 || num != nums[i-2] {
152-
nums[i] = num
153-
i++
154-
}
155-
}
156-
return i
157-
}
158-
```
159-
160160
### **Rust**
161161

162162
```rust
163163
impl Solution {
164164
pub fn remove_duplicates(nums: &mut Vec<i32>) -> i32 {
165-
let mut len = 0;
165+
let mut k = 0;
166166
for i in 0..nums.len() {
167-
if i < 2 || nums[i] != nums[len - 2] {
168-
nums[len] = nums[i];
169-
len += 1;
167+
if k < 2 || nums[i] != nums[k - 2] {
168+
nums[k] = nums[i];
169+
k += 1;
170170
}
171171
}
172-
len as i32
172+
k as i32
173173
}
174174
}
175175
```
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
class Solution {
22
public:
33
int removeDuplicates(vector<int>& nums) {
4-
int i = 0;
5-
for (int& num : nums)
6-
if (i < 2 || num != nums[i - 2])
7-
nums[i++] = num;
8-
return i;
4+
int k = 0;
5+
for (int x : nums) {
6+
if (k < 2 || x != nums[k - 2]) {
7+
nums[k++] = x;
8+
}
9+
}
10+
return k;
911
}
1012
};
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
public class Solution {
22
public int RemoveDuplicates(int[] nums) {
3-
int i = 0;
4-
foreach(int num in nums)
5-
{
6-
if (i < 2 || num != nums[i - 2])
7-
{
8-
nums[i++] = num;
3+
int k = 0;
4+
foreach (int x in nums) {
5+
if (k < 2 || x != nums[k - 2]) {
6+
nums[k++] = x;
97
}
108
}
11-
return i;
9+
return k;
1210
}
1311
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
func removeDuplicates(nums []int) int {
2-
i := 0
3-
for _, num := range nums {
4-
if i < 2 || num != nums[i-2] {
5-
nums[i] = num
6-
i++
2+
k := 0
3+
for _, x := range nums {
4+
if k < 2 || x != nums[k-2] {
5+
nums[k] = x
6+
k++
77
}
88
}
9-
return i
9+
return k
1010
}

0 commit comments

Comments
 (0)