219. Contains Duplicate II
在这里用了multimap bug出在前置++和->的优先级顺序,也就是正文注释处,一直没加小括号
时间复杂度为O(NlogN);
class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
//       map<int, int> imap;                          如果有三个或更多相同的数 此后只能跟仅插入的第一个数的下标比较 
//       for(int i = 0; i != nums.size(); ++i)        所以放弃这个思路 改用UNorder map
//         if(imap.find(nums[i] == imap.end()))
//           imap.insert(nums[i], i);
//         else
      multimap<int, int> imap;
      for(int i = 0; i != nums.size(); ++i)
        imap.insert({nums[i], i});
      for(int i = 0; i != nums.size(); ++i) {
        auto icount = imap.count(nums[i]);
        auto iter = imap.find(nums[i]);
        while(icount - 1) {
          if(iter->second + k >= (++iter)->second)    //bug
            return true;
          --icount;
        }
      }
      return false;
    }
};
答案中用set的方法 更快内存更小 时间O(N)
class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k)
    {
       unordered_set<int> s;
       
       if (k <= 0) return false;
       if (k >= nums.size()) k = nums.size() - 1;
       
       for (int i = 0; i < nums.size(); i++)
       {
           if (i > k) s.erase(nums[i - k - 1]);
           if (s.find(nums[i]) != s.end()) return true;
           s.insert(nums[i]);
       }
       
       return false;
    }
};
                    
                
                
            
        
浙公网安备 33010602011771号