leetcode 26.删除有序数组中的重复项

108 阅读1分钟

26. 删除有序数组中的重复项 - 力扣(LeetCode)

image.png

我刚开始想到了count,继而想到了set的count

set

这个代码是错误代码:


class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        unordered_set<int> once;
        for (auto ch : nums) {
            if (once.count(ch)) {
                ch = INT_MAX; // 将重复元素标记为INT_MAX
            } else {
                once.insert(ch);
            }
        }
        
        int i = 0;
        for (auto ch : nums) {
            if (ch != INT_MAX) { // 将不是INT_MAX的元素放到数组前面
                nums[i] = ch;
                i++;
            }
        }
        
        return i;
    }
};

image.png nums的值并没有被修改,原因:

image.png

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        unordered_set<int> once;
        int i = 0;
        for (int j = 0; j < nums.size(); j++) {
            if (once.count(nums[j]) == 0) { // 如果元素未出现过
                once.insert(nums[j]); // 将元素加入set中
                nums[i] = nums[j]; // 将元素放到数组前面
                i++;
            }
        }
        return i;
    }
};

image.png

有了set就可以用map

map

class Solution {
public:
    int singleNumber(vector<int>& nums) {

        unordered_map<int,int> OnceMap;

        for(auto ch:nums)
        {
               OnceMap[ch]++;  //是将num作为key,对应的value加1。这样就可以统计每个数字出现的次数了。
        }

       unordered_map <int,int>::iterator it=OnceMap.begin();
        int result=0;
       for( ;it!=OnceMap.end();it++)
       {
           if(it->second==1) 
           {
               result=it->first;
               return result;
           } 
       }
       

return -1;// 如果没有只出现一次的数字,则返回-1
    
    }
};

但是用set,map并不是最优解,因为需要遍历两遍数组,没有双指针效率高

双指针

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if (nums.empty()) {
            return 0;
        }
        
        int n = nums.size();
        int slow = 1;
        for (int fast = 1; fast < n; fast++) {
            if (nums[fast] != nums[fast-1]) {
                nums[slow] = nums[fast];
                slow++;
            }
        }
        
        return slow;
    }
};

image.png