Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Solution {
- public:
- bool containsNearbyAlmostDuplicate(vector <int> & nums, int k, int t) {
- if(nums.empty() || k==0 || t<0) return false;
- multiset<long long> kWindow;
- // if lower_bound and upper_bound are not found it returns set.end()
- for (long long i = 0; (i <= k && i<nums.size() ); i++) {
- if (!kWindow.empty()) {
- long long curr = nums[i];
- auto it1 = kWindow.upper_bound(curr);
- auto it2 = kWindow.lower_bound(curr);
- auto itTemp = prev(it2, 1);
- // cout << "Set elements: ";
- // for(auto &x: kWindow) cout << x << " ";
- // cout << endl;
- // cout << "Element coming: " << curr << endl;
- // cout << "Upper bound: " << *it1 << endl;
- // cout << "Lower bound: " << *it2 << endl;
- // //cout << "prevLowerBound: " << *itTemp << endl;
- // cout << "Upper bound is not present: " << (it1==kWindow.end()) << endl;
- // cout << "Lower bound is not present: " << (it2==kWindow.end()) << endl;
- // cout << "Is lower bound the beginning: " << (it2==kWindow.begin()) << endl;
- // cout << " ============= " << endl;
- if ( (it2!=kWindow.end() && *it2==curr) || (it2!=kWindow.end() && it2!=kWindow.begin() && curr-*itTemp<=t) || (it1!=kWindow.end() && *it1-curr<=t) || ( abs((long long)(*(kWindow.rbegin())-curr)) <=t) ) {
- cout << abs(*(kWindow.rbegin())-curr) << endl;
- return true;
- }
- kWindow.insert(curr);
- } else {
- kWindow.insert(nums[i]);
- }
- }
- for (long long i = k+1; i < nums.size(); i++) {
- //oldest element is i-k
- long long toDelete = nums[i - k - 1];
- auto itr = kWindow.find(toDelete);
- kWindow.erase(itr);
- long long curr = nums[i];
- auto it1 = kWindow.upper_bound(curr);
- auto it2 = kWindow.lower_bound(curr);
- auto itTemp = prev(it2, 1);
- //cout << "Set elements: ";
- //for(auto &x: kWindow) cout << x << " ";
- // cout << endl;
- // cout << "Element coming: " << curr << endl;
- // cout << "Upper bound: " << *it1 << endl;
- // cout << "Lower bound: " << *it2 << endl;
- // //cout << "prevLowerBound: " << *itTemp << endl;
- // cout << "Upper bound is not present: " << (it1==kWindow.end()) << endl;
- // cout << "Lower bound is not present: " << (it2==kWindow.end()) << endl;
- // cout << "Is lower bound the beginning: " << (it2==kWindow.begin()) << endl;
- // cout << " ============= " << endl << endl;
- if ((it2!=kWindow.end() && *it2==curr) || (it2!=kWindow.end() && it2!=kWindow.begin() && curr-*itTemp<=t) || (it1!=kWindow.end() && *it1-curr<=t) || ( abs((long long)(*(kWindow.rbegin())-curr)) <=t) ) {
- return true;
- }
- kWindow.insert(curr);
- }
- return false;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement