题目 - 点击直达
- 1. 26. 删除有序数组中的重复项 简单
- 1. 题目详情
- 1. 原题链接
- 2. 题目要求
- 3. 基础框架
- 2. 解题思路
- 1. 思路分析
- 2. 时间复杂度
- 3. 代码实现
1. 26. 删除有序数组中的重复项 简单
1. 题目详情
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
返回 k 。
判题标准:
系统会用下面的代码来测试你的题解:
int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案
int k = removeDuplicates(nums); // 调用
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
如果所有断言都通过,那么您的题解将被 通过。
1. 原题链接
LeetCode 26. 删除有序数组中的重复项 简单
2. 题目要求
示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
提示:
1
<
=
n
u
m
s
.
l
e
n
g
t
h
<
=
3
∗
104
1 <= nums.length <= 3 * 104
1<=nums.length<=3∗104
−
104
<
=
n
u
m
s
[
i
]
<
=
104
-104 <= nums[i] <= 104
−104<=nums[i]<=104
n
u
m
s
nums
nums 已按非严格递增排列
3. 基础框架
● Cpp代码框架
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
}
};
2. 解题思路
1. 思路分析
(
1
)
(1)
(1) 数组
n
u
m
s
nums
nums是非严格递增的,即非降序的。对数组
n
u
m
s
nums
nums进行去重处理。
(
2
)
(2)
(2) 一个变量
n
e
w
P
o
s
newPos
newPos记录新数组位置的下标;一个变量
o
l
d
P
o
s
oldPos
oldPos记录旧数组位置的下标;
新数组默认没有任何元素,故
n
e
w
P
o
s
newPos
newPos初始值设置为-1,是无效下标;
旧数组就是原数组,默认从0下标开始,故
o
l
d
P
o
s
oldPos
oldPos初始值为0;
(
3
)
(3)
(3) 对于
n
e
w
P
o
s
newPos
newPos为初始值-1的情况进行特殊处理,直接把
o
l
d
P
o
s
oldPos
oldPos位置元素赋值给
n
e
w
P
o
s
newPos
newPos的下一个位置即0下标位置;
(
4
)
(4)
(4) 对于一般情况:
首先可知
n
e
w
P
o
s
newPos
newPos之前的元素(不包含newPos)
都是有序且相对位置不变的去重后的唯一元素。
n
e
w
P
o
s
newPos
newPos当前位置的元素还未完全去重,通过比较
n
e
w
P
o
s
newPos
newPos位置上的元素和
o
l
d
P
o
s
oldPos
oldPos位置上的元素对该元素进行去重:
如果
n
u
m
s
[
n
e
w
P
o
s
]
=
=
n
u
m
s
[
o
l
d
P
o
s
]
nums[newPos]==nums[oldPos]
nums[newPos]==nums[oldPos]则说明
o
l
d
P
o
s
oldPos
oldPos位置上的元素在新数组中已经存在,不再考虑;反之则把
o
l
d
P
o
s
oldPos
oldPos位置上的元素赋值给
n
e
w
P
o
s
newPos
newPos的下一个位置上。
(
5
)
(5)
(5) 直到
o
l
d
P
o
s
oldPos
oldPos遍历完旧数组原数组
为止。
2. 时间复杂度
O ( N ) O(N) O(N)
o l d P o s oldPos oldPos遍历了一遍数组 n u m s nums nums。
3. 代码实现
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int newPos = -1;
int oldPos = 0;
while(oldPos < nums.size()){
// 如果newPos是-1时特殊判断一下
if(newPos == -1){
newPos++;
nums[newPos] = nums[oldPos];
}
// newPos位置表示当前已经存在的元素
// oldPos位置表示将要放入的元素
// 二者相等时则说明将要放入的元素在新数组中已经存在,;
// 反之则说明将要放入的元素在新数组中还不存在,需要放入newPos的下一个位置;
// 更新oldPos使其表示下一个位置的元素
else if(nums[oldPos] != nums[newPos]){
newPos++;
nums[newPos] = nums[oldPos];
}
oldPos++;
}
return newPos + 1;
}
};
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
// 借助额外空间,且是唯一有序的set
set<int> s;
for(auto& e : nums){
s.insert(e);
}
nums.clear();
for(auto& e : s){
nums.push_back(e);
}
return nums.size();
}
};
T h e The The E n d End End