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--因为您的解决方案反复调用
          擦除
          ,并且