1995 Finding Pairs With A Certain Sum
1995 Finding Pairs With A Certain Sum
Finding Pairs With a Certain Sum 
You are given two integer arrays nums1 and nums2. You are tasked to implement a data structure that supports queries of two types:
1
2
**Add** a positive integer to an element of a given index in the array nums2.
**Count** the number of pairs (i, j) such that nums1[i] + nums2[j] equals a given value (0 <= i < nums1.length and 0 <= j < nums2.length).
Implement the FindSumPairs class:
1
2
3
FindSumPairs(int[] nums1, int[] nums2) Initializes the FindSumPairs object with two integer arrays nums1 and nums2.
void add(int index, int val) Adds val to nums2[index], i.e., apply nums2[index] += val.
int count(int tot) Returns the number of pairs (i, j) such that nums1[i] + nums2[j] == tot.
Example 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
**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
2
3
4
5
6
7
8
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 to add and count **each**.
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class FindSumPairs:
def __init__(self, nums1: List[int], nums2: List[int]):
"""
sort nums1
for each nums1 < total , find in nums2 tot-i
as # of elements in nums1 < 1000, then count runs in 1000
"""
self.arr1 = nums1
self.arr2 = {}
self.arr3 = {}
for i, k in enumerate(nums2):
self.arr3[i] = k
for i,k in enumerate(nums2):
if k in self.arr2:
self.arr2[k].append(i)
else:
self.arr2[k] = [i]
def add(self, index: int, val: int) -> None:
k = self.arr3[index]
if k + val in self.arr2:
self.arr2[k + val].append(index)
else:
self.arr2[k + val] = [index]
self.arr2[k].remove(index)
self.arr3[index] = k + val
def count(self, tot: int) -> int:
res = 0
for k in self.arr1:
if tot - k in self.arr2:
res += len(self.arr2[tot-k])
return res
# Your FindSumPairs object will be instantiated and called as such:
# obj = FindSumPairs(nums1, nums2)
# obj.add(index,val)
# param_2 = obj.count(tot)
This post is licensed under CC BY 4.0 by the author.