题目:1865. 找出和为指定值的下标对
思路:哈希表,时间复杂度0(n)。
记录nums1、nums2数组,同时使用哈希表mp来维护数组nums2里元素出现的情况。
C++版本:
cpp
class FindSumPairs {
public:
vector<int> a1,a2;
unordered_map<int,int> mp;
FindSumPairs(vector<int>& nums1, vector<int>& nums2) {
a1=nums1;
a2=nums2;
for(auto x:nums2){
mp[x]++;
}
}
void add(int index, int val) {
int x=a2[index];
mp[x]--;
a2[index]+=val;
mp[x+val]++;
}
int count(int tot) {
int ans=0;
for(auto x:a1){
ans+=mp[tot-x];
}
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);
*/
JAVA版本:
java
class FindSumPairs {
int[] a1,a2;
Map<Integer,Integer> mp=new HashMap<>();
public FindSumPairs(int[] nums1, int[] nums2) {
a1=nums1;
a2=nums2;
for(var x:a2){
mp.merge(x,1,Integer::sum);
}
}
public void add(int index, int val) {
int x=a2[index];
mp.merge(x,-1,Integer::sum);
a2[index]+=val;
mp.merge(x+val,1,Integer::sum);
}
public int count(int tot) {
int ans=0;
for(var x:a1){
ans+=mp.getOrDefault(tot-x,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);
*/
GO版本:
go
type FindSumPairs struct {
a1 []int
a2 []int
mp map[int]int
}
func Constructor(nums1 []int, nums2 []int) FindSumPairs {
mp:=map[int]int{}
for _,x:=range nums2 {
mp[x]++
}
return FindSumPairs{
a1:nums1,
a2:nums2,
mp:mp,
}
}
func (this *FindSumPairs) Add(index int, val int) {
x:=this.a2[index]
this.mp[x]--
this.a2[index]+=val
this.mp[x+val]++
}
func (this *FindSumPairs) Count(tot int) int {
ans:=0
for _,x:=range this.a1 {
ans+=this.mp[tot-x]
}
return ans
}
/**
* Your FindSumPairs object will be instantiated and called as such:
* obj := Constructor(nums1, nums2);
* obj.Add(index,val);
* param_2 := obj.Count(tot);
*/