维护一个set,保存i之前且与i相差不超过k的一系列数,所以当i>k时,会删去set中nums[i - k - 1]的值,因此k要进行处理,如果k>nums.size(),k赋值为nums.size() - 1。
1 class Solution { 2 public: 3 bool containsNearbyDuplicate(vector<int>& nums, int k) { 4 if(k <= 0) return false; 5 if(k >= nums.size()) k = nums.size() - 1; 6 7 unordered_set<int> num_set; 8 9 for(int i = 0; i < nums.size(); ++i){ 10 if(i > k) num_set.erase(nums[i - k - 1]); 11 if(num_set.find(nums[i]) != num_set.end()) return true; 12 num_set.insert(nums[i]); 13 } 14 return false; 15 } 16 };
维护map,对应关系是数值及其位置,存放数值的最新位置(即最大位置),如果读入的数已存在且位置之差不大于k,return true。
会慢一些。
1 class Solution { 2 public: 3 bool containsNearbyDuplicate(vector<int>& nums, int k) { 4 map<int, int> map; 5 for(int i = 0; i < nums.size(); ++i){ 6 if(map.count(nums[i]) && (i - map[nums[i]]) <= k) return true; 7 map[nums[i]] = i; 8 } 9 return false; 10 } 11 };