查找表 219.Contains Duplicate,217 Contain Duplicate, 220
Posted bella2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找表 219.Contains Duplicate,217 Contain Duplicate, 220相关的知识,希望对你有一定的参考价值。
思路:滑动窗口(长度为k+1)看这个窗口里的是否有两个元素的值相同。加查找表。
//时间:O(n) //空间:O(k) class Solution { public: bool containsNearbyDuplicate(vector<int>& nums, int k) { unordered_set<int> record; //查找表 for(int i=0; i<nums.size();i++) { if(record.find(nums[i])!= record.end() ) return true; record.insert(nums[i]); //保持record中最多有k个元素,当右边有一个新的元素加入时,窗口才会变成k+1 if(record.size()==k+1) record.erase(nums[i-k]); } return false; } };
class Solution { public: bool containsDuplicate(vector<int>& nums) { unordered_set<int> record; for(int i=0;i<nums.size();i++){ if(record.find(nums[i])!=record.end()) return true; record.insert(nums[i]); } return false; } };
函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置.
注意:如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!
//时间:O(nlogn)
//空间:O(k)
对于数组中有2147483647这个值时,当nums[i]+t 容易造成整型溢出。注意整型溢出,改变类型为 long long 。
class Solution { public: bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) { //long long 64位整型 set<long long > record; //因为调用lower_bound 需要有顺序性,所以使用set for(int i=0;i<nums.size();i++){ //查找大于或等于nums[i]-t的第一个元素的位置 if(record.lower_bound( (long long)nums[i]-(long long)t) != record.end() && *record.lower_bound( (long long)nums[i]-(long long)t)<= (long long)nums[i]+(long long)t) return true; record.insert(nums[i]); if(record.size() == k+1) record.erase(nums[i-k]); } return false; } };
以上是关于查找表 219.Contains Duplicate,217 Contain Duplicate, 220的主要内容,如果未能解决你的问题,请参考以下文章