C++ 使用O(1)辅助空间(LeetCode)从已排序数组中删除重复项
这是我的职责C++ 使用O(1)辅助空间(LeetCode)从已排序数组中删除重复项,c++,algorithm,vector,duplicates,c++14,C++,Algorithm,Vector,Duplicates,C++14,这是我的职责 class Solution { public: int removeDuplicates(vector<int>& nums) { auto i = nums.begin(); int prev = *i; i++; for(;i!=nums.end();i++){ if(*i == prev){ nums.erase(i)
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
auto i = nums.begin();
int prev = *i;
i++;
for(;i!=nums.end();i++){
if(*i == prev){
nums.erase(i);
}
prev = *i;
}
return (int)nums.size();
}
};
类解决方案{
公众:
int-removeDuplicates(向量和nums){
自动i=nums.begin();
int prev=*i;
i++;
对于(;i!=nums.end();i++){
如果(*i==prev){
nums.erase(i);
}
prev=*i;
}
返回(int)nums.size();
}
};
它通过引用调用向量,所以我们必须返回修改后的向量的长度,该长度没有重复项
它有什么问题以及如何改进答案?将使迭代器无效并返回新的迭代器,因此您应该捕获返回的迭代器
试试这个:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
auto i = nums.begin();
int prev = *i;
i++;
for(;i!=nums.end();){
if(*i == prev){
i = nums.erase(i);
} else {
prev = *i;
i++;
}
}
return (int)nums.size();
}
};
类解决方案{
公众:
int-removeDuplicates(向量和nums){
自动i=nums.begin();
int prev=*i;
i++;
对于(;i!=nums.end();){
如果(*i==prev){
i=nums.erase(i);
}否则{
prev=*i;
i++;
}
}
返回(int)nums.size();
}
};
或者更简单一点:
#include <algorithm>
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
auto i = std::unique(nums.begin(), nums.end());
nums.erase(i, nums.end());
return (int)nums.size();
}
};
#包括
类解决方案{
公众:
int-removeDuplicates(向量和nums){
auto i=std::unique(nums.begin(),nums.end());
擦除(i,nums.end());
返回(int)nums.size();
}
};
将使迭代器无效并返回新的迭代器,因此您应该捕获返回的迭代器
试试这个:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
auto i = nums.begin();
int prev = *i;
i++;
for(;i!=nums.end();){
if(*i == prev){
i = nums.erase(i);
} else {
prev = *i;
i++;
}
}
return (int)nums.size();
}
};
类解决方案{
公众:
int-removeDuplicates(向量和nums){
自动i=nums.begin();
int prev=*i;
i++;
对于(;i!=nums.end();){
如果(*i==prev){
i=nums.erase(i);
}否则{
prev=*i;
i++;
}
}
返回(int)nums.size();
}
};
或者更简单一点:
#include <algorithm>
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
auto i = std::unique(nums.begin(), nums.end());
nums.erase(i, nums.end());
return (int)nums.size();
}
};
#包括
类解决方案{
公众:
int-removeDuplicates(向量和nums){
auto i=std::unique(nums.begin(),nums.end());
擦除(i,nums.end());
返回(int)nums.size();
}
};
不使用擦除
,这也会通过:
// Most of headers are already included;
// Can be removed;
#include <cstdint>
#include <vector>
// Start
static const struct Solution {
using SizeType = std::uint_fast32_t;
static const int removeDuplicates(std::vector<int>& nums) {
SizeType len = std::size(nums);
SizeType count = 0;
for (auto i = 1; i < len; ++i) {
if (nums[i] == nums[i - 1]) {
++count;
} else {
nums[i - count] = nums[i];
}
}
return len - count;
}
};
//大多数标题已经包含在内;
//可以移除;
#包括
#包括
//开始
静态常数结构解{
使用SizeType=std::uint\u fast32\u t;
移除的静态常量(标准::向量和nums){
SizeType len=std::size(nums);
SizeType计数=0;
用于(自动i=1;i
工具书类
- 有关更多详细信息,请参阅,您可以在其中找到大量解释良好的公认解决方案,包括各种有效算法和渐近/复杂性分析
不使用
擦除
,这也会通过:
// Most of headers are already included;
// Can be removed;
#include <cstdint>
#include <vector>
// Start
static const struct Solution {
using SizeType = std::uint_fast32_t;
static const int removeDuplicates(std::vector<int>& nums) {
SizeType len = std::size(nums);
SizeType count = 0;
for (auto i = 1; i < len; ++i) {
if (nums[i] == nums[i - 1]) {
++count;
} else {
nums[i - count] = nums[i];
}
}
return len - count;
}
};
//大多数标题已经包含在内;
//可以移除;
#包括
#包括
//开始
静态常数结构解{
使用SizeType=std::uint\u fast32\u t;
移除的静态常量(标准::向量和nums){
SizeType len=std::size(nums);
SizeType计数=0;
用于(自动i=1;i
工具书类
- 有关更多详细信息,请参阅,您可以在其中找到大量解释良好的公认解决方案,包括各种有效算法和渐近/复杂性分析
推荐阅读:@ USER881301标题中说“从排序数组中删除重复”BTW,没有要求C++程序只能通过类执行函数。这应该是一个独立的函数。
main
是一个独立函数的示例。@OP--如果数组已排序,则有比您尝试的更好的解决方案。首先,std::unique
已经为您完成了这项工作,如果您看到它是如何工作的,您应该看到它只是在遍历数组时将唯一元素复制到非唯一元素位置。那么剩下唯一要做的就是一次erase
,从最后一个唯一位置+1一直擦除到数组的末尾(这就是vector.erase
应该做的)。@OP--由于您的解决方案反复调用erase
,并且您正在使用在线评委比赛网站测试您的代码,请记住,如果输入非常大,这些网站的问题旨在给出超时错误。例如,如果字符串包含数千个字符和许多重复项,则您的解决方案可能会由于对找到的每个重复项调用erase
而出现超时错误。因此,更安全的解决方案是复制类似于<>代码> STD::唯一的< /C> >,然后在最后一个擦除。推荐阅读:@ USER481301标题:“从排序数组中删除重复”BTW,没有要求C++程序只能通过类执行函数。这应该是一个独立的函数。main
是一个独立函数的示例。@OP--如果数组已排序,则有比您尝试的更好的解决方案。首先,std::unique
已经为您完成了这项工作,如果您看到它是如何工作的,您应该看到它只是在遍历数组时将唯一元素复制到非唯一元素位置。然后剩下的唯一一件事就是执行一次擦除
,从最后一个唯一位置+1一直擦除到数组末尾(这就是vector.erase
应该执行的操作)。@OP--因为您的解决方案反复调用擦除
,并且