生活随笔
收集整理的這篇文章主要介紹了
LeetCode 454. 四数相加 II(哈希)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 題目
給定四個包含整數的數組列表 A , B , C , D ,計算有多少個元組 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。
為了使問題簡單化,所有的 A, B, C, D 具有相同的長度 N,且 0 ≤ N ≤ 500 。所有整數的范圍在 -228 到 228 - 1 之間,最終結果不會超過 231 - 1 。
類似題目:POJ 2785
2. 解題
class Solution {int *ab
, *cd
;
public:int fourSumCount(vector
<int>& A
, vector
<int>& B
, vector
<int>& C
, vector
<int>& D
) {int n
= A
.size(), i
, j
, k
= 0, ans
= 0;int N
= n
*n
;ab
= new int[N
];cd
= new int[N
];for(i
= 0; i
< n
; ++i
)for(j
= 0; j
< n
; ++j
)ab
[k
++] = A
[i
]+B
[j
];k
= 0;for(i
= 0; i
< n
; ++i
)for(j
= 0; j
< n
; ++j
)cd
[k
++] = -C
[i
]-D
[j
];sort(cd
,cd
+N
);for(i
= 0; i
< N
; ++i
){ans
+= findV(ab
[i
], N
);}return ans
;}int findV(int &val
, int &N
){int i
= 0, j
= N
-1, mid
, count
= 0, idx
;while(i
<= j
){mid
= i
+((j
-i
)>>1);if(val
== cd
[mid
]){idx
= mid
-1;while(idx
>= 0 && cd
[idx
--] == val
)++count
;idx
= mid
+1;while(idx
< N
&& cd
[idx
++] == val
)++count
;return count
+1;}else if(val
< cd
[mid
])j
= mid
-1;elsei
= mid
+1;}return 0;}
};
class Solution {
public:int fourSumCount(vector
<int>& A
, vector
<int>& B
, vector
<int>& C
, vector
<int>& D
) {int n
= A
.size(), i
, j
, ans
= 0;unordered_map
<int, int> m
;for(i
= 0; i
< n
; ++i
)for(j
= 0; j
< n
; ++j
)if(m
.find(A
[i
]+B
[j
]) == m
.end())m
[A
[i
]+B
[j
]] = 1;elsem
[A
[i
]+B
[j
]]++;for(i
= 0; i
< n
; ++i
)for(j
= 0; j
< n
; ++j
)if(m
.find(-C
[i
]-D
[j
]) != m
.end())ans
+= m
[-C
[i
]-D
[j
]];return ans
;}
};
總結
以上是生活随笔為你收集整理的LeetCode 454. 四数相加 II(哈希)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。