Lower bound and upper bound of set/map
STL’s map/set/multimap/multiset is an ordered container which compares to unordered_map and unordered_set. So there are special methods which implemented due to the order. multiset and multimap allow repeated elements. Its erase method is a little different.
Introduction
set and map are implemented using Red-Black Tree. They are sorted containers. If we traverse it from begin to end, we will get a sorted collections according the key type.
So if we want to maintain a sorted range, we can use them. But if we want a faster insert and access of the data, the unordered versions(unordered_set and unordered_map) are suggested.
Search and find
lower_bound: Find the first number which is>=targetupper_bound: Find the first number which is>targetequal_range: Range between(lower_bound,upper_bound)find: Find the specific target, (C++ 20 intoducescontains)
Delete elements
We can delete an element using erase. But when it comes to multiset or multimap, it is a little different.
erase(iterator pos)erase(iterator start, iterator end)erase(key_type key)
When we only specify the key, it will delete all the keys instead of deleting only one element.
In 220. Contains Duplicate III, we need to maintain a range which is sorted. When the size of the set is larger than required, we need to delete the head element.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 220. Contains Duplicate III
// https://leetcode.com/problems/contains-duplicate-iii/
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
int size = nums.size();
if (k == 0 || size < 2) return false;
multiset<int> s;
s.insert(nums[0]);
for (int i = 1; i < size; ++i) {
auto l = s.lower_bound(nums[i]);
auto r = prev(l);
if (l != s.end() && (abs(*l - (long long)nums[i])) <= t) return true;
if (r != s.end() && (abs(*prev(l) - (long long)nums[i])) <= t) return true;
if (s.size() == k) {
// We cannot directly delete: s.erase(nums[i-k]);
auto ite = s.find(nums[i-k]);
s.erase(ite);
}
s.insert(nums[i]);
}
return false;
}
};