Skip to content

Commit 4e1c582

Browse files
Create 26. 删除有序数组中的重复项.md
1 parent cf495e8 commit 4e1c582

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#### 26. 删除有序数组中的重复项
2+
3+
难度:简单
4+
5+
---
6+
7+
给你一个 **非严格递增排列** 的数组 `nums` ,请你 **[原地](http://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95)** 删除重复出现的元素,使每个元素 **只出现一次** ,返回删除后数组的新长度。元素的 **相对顺序** 应该保持 **一致** 。然后返回 `nums` 中唯一元素的个数。
8+
9+
考虑 `nums` 的唯一元素的数量为 `k` ,你需要做以下事情确保你的题解可以被通过:
10+
11+
* 更改数组 `nums` ,使 `nums` 的前 `k` 个元素包含唯一元素,并按照它们最初在 `nums` 中出现的顺序排列。`nums` 的其余元素与 `nums` 的大小不重要。
12+
* 返回 `k` 。
13+
14+
**判题标准:**
15+
16+
系统会用下面的代码来测试你的题解:
17+
18+
```
19+
int[] nums = [...]; // 输入数组
20+
int[] expectedNums = [...]; // 长度正确的期望答案
21+
22+
int k = removeDuplicates(nums); // 调用
23+
24+
assert k == expectedNums.length;
25+
for (int i = 0; i < k; i++) {
26+
assert nums[i] == expectedNums[i];
27+
}
28+
```
29+
30+
如果所有断言都通过,那么您的题解将被 **通过**
31+
32+
**示例 1:**
33+
34+
```
35+
输入:nums = [1,1,2]
36+
输出:2, nums = [1,2,_]
37+
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
38+
```
39+
40+
**示例 2:**
41+
42+
```
43+
输入:nums = [0,0,1,1,1,2,2,3,3,4]
44+
输出:5, nums = [0,1,2,3,4]
45+
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
46+
```
47+
48+
**提示:**
49+
50+
* `1 <= nums.length <= 3 * 10^4`
51+
* `-10^4 <= nums[i] <= 10^4`
52+
* `nums` 已按 **非严格递增**  排列
53+
54+
---
55+
56+
双指针:
57+
58+
可以理解为快慢指针,`left` 指针指向将被替代的值,`right` 快指针指向待检查的值。
59+
60+
判断两指针的元素是否相等,若不相等则将 `right` 指针的元素交给 `left + 1`**右移左右指针**;否则只移动右指针。
61+
62+
```Java
63+
class Solution {
64+
public int removeDuplicates(int[] nums) {
65+
int n = nums.length, left = 0, right = 0;
66+
if(n <= 1) return n;
67+
while(right < n){
68+
if(nums[right] != nums[left]){
69+
nums[++left] = nums[right];
70+
}
71+
right++;
72+
}
73+
return left + 1;
74+
}
75+
}
76+
```

0 commit comments

Comments
 (0)