Welcome to Subscribe On Youtube
1865. Finding Pairs With a Certain Sum
Description
You are given two integer arrays nums1
and nums2
. You are tasked to implement a data structure that supports queries of two types:
- Add a positive integer to an element of a given index in the array
nums2
. - Count the number of pairs
(i, j)
such thatnums1[i] + nums2[j]
equals a given value (0 <= i < nums1.length
and0 <= j < nums2.length
).
Implement the FindSumPairs
class:
FindSumPairs(int[] nums1, int[] nums2)
Initializes theFindSumPairs
object with two integer arraysnums1
andnums2
.void add(int index, int val)
Addsval
tonums2[index]
, i.e., applynums2[index] += val
.int count(int tot)
Returns the number of pairs(i, j)
such thatnums1[i] + nums2[j] == tot
.
Example 1:
Input ["FindSumPairs", "count", "add", "count", "count", "add", "add", "count"] [[[1, 1, 2, 2, 2, 3], [1, 4, 5, 2, 5, 4]], [7], [3, 2], [8], [4], [0, 1], [1, 1], [7]] Output [null, 8, null, 2, 1, null, null, 11] Explanation FindSumPairs findSumPairs = new FindSumPairs([1, 1, 2, 2, 2, 3], [1, 4, 5, 2, 5, 4]); findSumPairs.count(7); // return 8; pairs (2,2), (3,2), (4,2), (2,4), (3,4), (4,4) make 2 + 5 and pairs (5,1), (5,5) make 3 + 4 findSumPairs.add(3, 2); // now nums2 = [1,4,5,4,5,4
] findSumPairs.count(8); // return 2; pairs (5,2), (5,4) make 3 + 5 findSumPairs.count(4); // return 1; pair (5,0) makes 3 + 1 findSumPairs.add(0, 1); // now nums2 = [2
,4,5,4,5,4
] findSumPairs.add(1, 1); // now nums2 = [2
,5,5,4,5,4
] findSumPairs.count(7); // return 11; pairs (2,1), (2,2), (2,4), (3,1), (3,2), (3,4), (4,1), (4,2), (4,4) make 2 + 5 and pairs (5,3), (5,5) make 3 + 4
Constraints:
1 <= nums1.length <= 1000
1 <= nums2.length <= 105
1 <= nums1[i] <= 109
1 <= nums2[i] <= 105
0 <= index < nums2.length
1 <= val <= 105
1 <= tot <= 109
- At most
1000
calls are made toadd
andcount
each.
Solutions
-
class FindSumPairs { private int[] nums1; private int[] nums2; private Map<Integer, Integer> cnt = new HashMap<>(); public FindSumPairs(int[] nums1, int[] nums2) { this.nums1 = nums1; this.nums2 = nums2; for (int v : nums2) { cnt.put(v, cnt.getOrDefault(v, 0) + 1); } } public void add(int index, int val) { int old = nums2[index]; cnt.put(old, cnt.get(old) - 1); cnt.put(old + val, cnt.getOrDefault(old + val, 0) + 1); nums2[index] += val; } public int count(int tot) { int ans = 0; for (int v : nums1) { ans += cnt.getOrDefault(tot - v, 0); } return ans; } } /** * Your FindSumPairs object will be instantiated and called as such: * FindSumPairs obj = new FindSumPairs(nums1, nums2); * obj.add(index,val); * int param_2 = obj.count(tot); */
-
class FindSumPairs { public: FindSumPairs(vector<int>& nums1, vector<int>& nums2) { this->nums1 = nums1; this->nums2 = nums2; for (int& v : nums2) { ++cnt[v]; } } void add(int index, int val) { int old = nums2[index]; --cnt[old]; ++cnt[old + val]; nums2[index] += val; } int count(int tot) { int ans = 0; for (int& v : nums1) { ans += cnt[tot - v]; } return ans; } private: vector<int> nums1; vector<int> nums2; unordered_map<int, int> cnt; }; /** * Your FindSumPairs object will be instantiated and called as such: * FindSumPairs* obj = new FindSumPairs(nums1, nums2); * obj->add(index,val); * int param_2 = obj->count(tot); */
-
class FindSumPairs: def __init__(self, nums1: List[int], nums2: List[int]): self.nums1 = nums1 self.nums2 = nums2 self.cnt = Counter(nums2) def add(self, index: int, val: int) -> None: old = self.nums2[index] self.cnt[old] -= 1 self.cnt[old + val] += 1 self.nums2[index] += val def count(self, tot: int) -> int: return sum(self.cnt[tot - v] for v in self.nums1) # Your FindSumPairs object will be instantiated and called as such: # obj = FindSumPairs(nums1, nums2) # obj.add(index,val) # param_2 = obj.count(tot)
-
type FindSumPairs struct { nums1 []int nums2 []int cnt map[int]int } func Constructor(nums1 []int, nums2 []int) FindSumPairs { cnt := map[int]int{} for _, v := range nums2 { cnt[v]++ } return FindSumPairs{nums1, nums2, cnt} } func (this *FindSumPairs) Add(index int, val int) { old := this.nums2[index] this.cnt[old]-- this.cnt[old+val]++ this.nums2[index] += val } func (this *FindSumPairs) Count(tot int) (ans int) { for _, v := range this.nums1 { ans += this.cnt[tot-v] } return } /** * Your FindSumPairs object will be instantiated and called as such: * obj := Constructor(nums1, nums2); * obj.Add(index,val); * param_2 := obj.Count(tot); */