diff options
-rw-r--r-- | design_number_container.cpp | 39 | ||||
-rw-r--r-- | design_number_container.py | 46 |
2 files changed, 85 insertions, 0 deletions
diff --git a/design_number_container.cpp b/design_number_container.cpp new file mode 100644 index 0000000..bc37a6a --- /dev/null +++ b/design_number_container.cpp @@ -0,0 +1,39 @@ +// 2349. Design a Number Container System +#include "leetcode.h" + +/* + * design a number container system that can do the following: insert or replace + * a number at the given index in the system or return the smallest index for + * the given number in the system. implement the 'NumberContainers' class. + */ + +class NumberContainers { +private: + unordered_map<int, int> idxs; + unordered_map<int, set<int>> nums; + +public: + void change(int index, int number) { + auto i = idxs.find(index); + if (i != end(idxs)) + nums[i->second].erase(index); + idxs[index] = number; + nums[number].insert(index); + } + int find(int number) { + auto i = nums.find(number); + return i == end(nums) || i->second.empty() ? -1 : *begin(i->second); + } +}; + +int main() { + NumberContainers *obj = new NumberContainers(); + printf("%d\n", obj->find(10)); // expect: -1 + obj->change(2, 10); + obj->change(1, 10); + obj->change(3, 10); + obj->change(5, 10); + printf("%d\n", obj->find(10)); // expect: 1 + obj->change(1, 20); + printf("%d\n", obj->find(10)); // expect: 2 +} diff --git a/design_number_container.py b/design_number_container.py new file mode 100644 index 0000000..c343677 --- /dev/null +++ b/design_number_container.py @@ -0,0 +1,46 @@ +# 2349. Design a Number Container System +from collections import defaultdict +from bisect import insort_left + +""" +design a number container system that can do the following: insert or replace +a number at the given index in the system or return the smallest index for +the given number in the system. implement the 'NumberContainers' class. +""" + + +class NumberContainers(object): + def __init__(self): + self.idxs = {} + self.nums = defaultdict(list) + + def change(self, index, number): + """ + :type index: int + :type number: int + :rtype: None + """ + if index in self.idxs: + old = self.idxs[index] + self.nums[old].remove(index) + self.idxs[index] = number + insort_left(self.nums[number], index) + + def find(self, number): + """ + :type number: int + :rtype: int + """ + return -1 if not self.nums[number] else self.nums[number][0] + + +if __name__ == "__main__": + obj = NumberContainers() + print(obj.find(10)) + obj.change(2, 10) + obj.change(1, 10) + obj.change(3, 10) + obj.change(5, 10) + print(obj.find(10)) + obj.change(1, 20) + print(obj.find(10)) |