C++ 从已排序向量中删除重复项
给定一个已排序的数组nums,在适当的位置删除重复项,以便 每个元素只出现一次并返回新的长度 不要为另一个数组分配额外空间,必须通过 使用O(1)个额外内存就地修改输入阵列 例1: 给定C++ 从已排序向量中删除重复项,c++,C++,给定一个已排序的数组nums,在适当的位置删除重复项,以便 每个元素只出现一次并返回新的长度 不要为另一个数组分配额外空间,必须通过 使用O(1)个额外内存就地修改输入阵列 例1: 给定nums=[1,1,2] 函数应返回length=2,其中前两个元素为 nums分别为1和2 在返回的长度之外,您留下什么并不重要。例子 2: 给定'nums=[0,0,1,1,1,2,2,3,3,4] 函数应该返回length=5,包含前五个元素 分别修改为0、1、2、3和4的NUM的数量 在返回的长度之外设置
nums=[1,1,2]
函数应返回length=2,其中前两个元素为
nums分别为1和2
在返回的长度之外,您留下什么并不重要。例子
2:
给定'nums=[0,0,1,1,1,2,2,3,3,4]
函数应该返回length=5,包含前五个元素
分别修改为0、1、2、3和4的NUM的数量
在返回的长度之外设置什么值并不重要。
澄清:
不明白为什么返回值是整数,而您的答案是整数
阵列
请注意,输入数组是通过引用传入的,这意味着
调用者也会知道对输入数组的修改
在内部,你可以这样想:
// nums is passed in by
reference. (i.e., without making a copy) int len =
removeDuplicates(nums);
// any modification to nums in your function would be known by the
caller. // using the length returned by your function, it prints the
first len elements. for (int i = 0; i < len; i++) {
print(nums[i]); }
//nums是通过
参考资料。(即,不制作副本)int len=
移除的副本(nums);
//函数中对NUM的任何修改都将被
来电者使用函数返回的长度,它将打印
第一透镜元件。对于(int i=0;i
我在leetcode上提交时遇到此运行时错误。它在编码块上运行良好,但在leetcode编译器中显示此错误
第924行:字符9:运行时错误:引用绑定到“int”类型的空指针(stl_vector.h)
摘要:UndefinedBehaviorSanitizer:undefined behavior/usr/bin/./lib/gcc/x86_64-linux-gnu/8/../../../../../../include/c++/8/bits/stl_vector.h:933:9
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int k=nums[0];
for(auto i=nums.begin()+1;i<nums.end();i++)
{
if(*i==k) nums.erase(i) , i--;
else k=*i;
}
return nums.size();
}
};
类解决方案{
公众:
int-removeDuplicates(向量和nums){
int k=nums[0];
对于(自动i=nums.begin()+1;i
- 您的代码工作正常,缺少一个边缘大小写(一个空的
nums
):
- 更新代码:
- 您的代码工作正常,缺少一个边缘大小写(一个空的
nums
):
- 更新代码:
nums.erase(i),i--
i=nums.erase(i)
您可以调用sort
,然后调用unique
。(和erase
)。除非您出于某种原因想显式执行此操作,否则为什么不执行nums.erase(std::unique(nums.begin(),nums.end())
?@TanveerBadar在这个问题的上下文中从排序向量中删除重复项
确实不需要对唯一的进行排序
。我想这就是Emma的评论。我的意思是,否则,排序
对于OP的算法也是必需的。@OP,请注意tnums.erase(std::unique(nums.begin(),nums.end())
也可以处理空向量。nums.erase(i),i--
->i=nums.erase(i)
您可以调用sort
,然后unique
(和erase
)。除非出于某种原因要显式执行此操作,否则为什么不执行nums.erase(std::unique(nums.begin(),nums.end())
?@TanveerBadar在这个问题的上下文中从排序向量中删除重复项
确实不需要对唯一的进行排序
。我想这就是Emma的评论。我的意思是,否则,排序
对于OP的算法也是必需的。@OP,请注意tnums.erase(std::unique(nums.begin(),nums.end())
也可以处理空向量。我不知道如何传递leetcode,但这不会删除任何内容。好吧,那只是……我认为应该为leetcode
或竞争性编程问题添加一个标签,这样人们就不会浪费时间回答与编程无关的问题:(当然,这只适用于不想这样做的人。如果人们喜欢这类事情,那么这样做是完全合理的。嗯,真的吗?有没有关于这方面的元帖子或其他链接?我觉得这种性质的标签有充分的理由。@cigien这里是“问题”只是quesitons标题与实际需求不匹配(实际上只需要删除元素后容器的大小,即使没有容器也可以得到),但总的来说,我完全同意leetcode
标签或竞争性编码
,总的来说@TanveerBadarI不知道如何传递leetcode,但这并没有删除任何内容。嗯,那只是……我认为应该为leetcode
或竞争性编程问题设置标签,这样人们就不会被忽略e回答与编程无关的问题的时间:(当然,这只适用于不想这样做的人。如果人们喜欢这类事情,那么这样做是完全合理的。嗯,真的吗?有没有关于这方面的元帖子或其他链接?我觉得这种性质的标签有充分的理由。@cigien这里是“问题”只是quesitons标题与实际需求不匹配(实际上只需要删除元素后的容器大小,即使没有容器也可以得到),但总体而言,我完全同意@TanveerBadar中的leetcode
标记或竞争编码
if (nums.empty()) {
return 0;
}
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.empty()) {
return 0;
}
int k = nums[0];
for (auto i = nums.begin() + 1; i < nums.end(); i++) {
if (*i == k) {
nums.erase(i) , i--;
}
else {
k = *i;
}
}
return nums.size();
}
};
// Most of headers are already included;
// Can be removed;
#include <cstdint>
#include <vector>
// Start
static const struct Solution {
using SizeType = std::uint_fast16_t;
static const int removeDuplicates(
std::vector<int>& nums
) {
const SizeType len = std::size(nums);
SizeType count = 0;
for (SizeType i = 1; i < len; ++i) {
if (nums[i] == nums[i - 1]) {
++count;
} else {
nums[i - count] = nums[i];
}
}
return len - count;
}
};