@@ -30,7 +30,6 @@ for (int i = 0; i < len; i++) {
30
30
print(nums[i]);
31
31
}
32
32
</pre >
33
-
34
33
35
34
<p ><strong >示例 1:</strong ></p >
36
35
@@ -60,11 +59,17 @@ for (int i = 0; i < len; i++) {
60
59
61
60
<p > </p >
62
61
63
-
64
62
## 解法
65
63
66
64
<!-- 这里可写通用的实现逻辑 -->
67
65
66
+ 原问题要求最多相同的数字最多出现 1 次,我们可以扩展至相同的数字最多保留 k 个。
67
+
68
+ - 由于相同的数字最多保留 k 个,那么原数组的前 k 个元素我们可以直接保留;
69
+ - 对于后面的数字,能够保留的前提是:当前数字 num 与前面已保留的数字的倒数第 k 个元素比较,不同则保留,相同则跳过。
70
+
71
+ 相似题目:[ 80. 删除有序数组中的重复项 II] ( /solution/0000-0099/0080.Remove%20Duplicates%20from%20Sorted%20Array%20II/README.md )
72
+
68
73
<!-- tabs:start -->
69
74
70
75
### ** Python3**
@@ -74,13 +79,12 @@ for (int i = 0; i < len; i++) {
74
79
``` python
75
80
class Solution :
76
81
def removeDuplicates (self , nums : List[int ]) -> int :
77
- cnt, n = 0 , len (nums)
78
- for i in range (1 , n):
79
- if nums[i] == nums[i - 1 ]:
80
- cnt += 1
81
- else :
82
- nums[i - cnt] = nums[i]
83
- return n - cnt
82
+ i = 0
83
+ for num in nums:
84
+ if i < 1 or num != nums[i - 1 ]:
85
+ nums[i] = num
86
+ i += 1
87
+ return i
84
88
```
85
89
86
90
### ** Java**
@@ -90,64 +94,62 @@ class Solution:
90
94
``` java
91
95
class Solution {
92
96
public int removeDuplicates (int [] nums ) {
93
- int cnt = 0 , n = nums. length;
94
- for (int i = 1 ; i < n; ++ i) {
95
- if (nums[i] == nums[i - 1 ]) ++ cnt;
96
- else nums[i - cnt] = nums[i];
97
+ int i = 0 ;
98
+ for (int num : nums) {
99
+ if (i < 1 || num != nums[i - 1 ]) {
100
+ nums[i++ ] = num;
101
+ }
97
102
}
98
- return n - cnt ;
103
+ return i ;
99
104
}
100
105
}
101
106
```
102
107
103
- ### ** JavaScript **
108
+ ### ** C++ **
104
109
105
- ``` js
106
- /**
107
- * @param {number[]} nums
108
- * @return {number}
109
- */
110
- var removeDuplicates = function (nums ) {
111
- let cnt = 0 ;
112
- const n = nums .length ;
113
- for (let i = 1 ; i < n; ++ i) {
114
- if (nums[i] == nums[i - 1 ]) ++ cnt;
115
- else nums[i - cnt] = nums[i];
116
- }
117
- return n - cnt;
110
+ ``` cpp
111
+ class Solution {
112
+ public:
113
+ int removeDuplicates(vector<int >& nums) {
114
+ int i = 0;
115
+ for (int& num : nums)
116
+ if (i < 1 || num != nums[ i - 1] )
117
+ nums[ i++] = num;
118
+ return i;
119
+ }
118
120
};
119
121
```
120
122
121
123
### **Go**
122
124
123
125
```go
124
126
func removeDuplicates(nums []int) int {
125
- cnt := 0
126
- n := len (nums)
127
- for i := 1 ; i < n; i++ {
128
- if nums[i] == nums[i - 1 ] {
129
- cnt++
130
- } else {
131
- nums[i - cnt] = nums[i]
132
- }
133
- }
134
- return n - cnt
127
+ i := 0
128
+ for _, num := range nums {
129
+ if i < 1 || num != nums[i-1] {
130
+ nums[i] = num
131
+ i++
132
+ }
133
+ }
134
+ return i
135
135
}
136
136
```
137
137
138
- ### ** C++ **
138
+ ### ** JavaScript **
139
139
140
- ``` cpp
141
- class Solution {
142
- public:
143
- int removeDuplicates(vector<int >& nums) {
144
- int cnt = 0, n = nums.size();
145
- for (int i = 1; i < n; ++i) {
146
- if (nums[ i] == nums[ i - 1] ) ++cnt;
147
- else nums[ i - cnt] = nums[ i] ;
140
+ ``` js
141
+ /**
142
+ * @param {number[]} nums
143
+ * @return {number}
144
+ */
145
+ var removeDuplicates = function (nums ) {
146
+ let i = 0 ;
147
+ for (const num of nums) {
148
+ if (i < 1 || num != nums[i - 1 ]) {
149
+ nums[i++ ] = num;
148
150
}
149
- return n - cnt;
150
151
}
152
+ return i;
151
153
};
152
154
```
153
155
@@ -156,20 +158,15 @@ public:
156
158
``` cs
157
159
public class Solution {
158
160
public int RemoveDuplicates (int [] nums ) {
159
- int cnt = 0;
160
- int n = nums.Length;
161
- for (int i = 1; i < n; ++i)
161
+ int i = 0 ;
162
+ foreach (int num in nums )
162
163
{
163
- if (nums[i] == nums[i - 1])
164
- {
165
- ++cnt;
166
- }
167
- else
164
+ if (i < 1 || num != nums [i - 1 ])
168
165
{
169
- nums[i - cnt ] = nums[i] ;
166
+ nums [i ++ ] = num ;
170
167
}
171
168
}
172
- return n - cnt ;
169
+ return i ;
173
170
}
174
171
}
175
172
```
0 commit comments