題意:zjm 有四個數列 a,b,c,d,每個數列都有 n 個數字。zjm 從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。
當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。
思路:
1.暴力列舉o(n^4)
2.兩兩枚舉o(n^2),利用桶排
3.兩兩分組,一組求和排序(排序後可以用二分查詢),另一組列舉求和sum,然後在上一組利用二分查詢-sum的個數,時間複雜度比n^2高,但適應於桶排無法接受的資料範圍(1e9)
總結:該題重要的是兩兩分組,求和處理,根據不同資料範圍運用不同方法
反思:vector陣列應用於資料範圍較小時,當資料範圍很大時靜態陣列比vector效率高。
**:
//o(n^2)
#include
#include
#include
using
namespace std;
vector<
int>p[4]
;int mp[
1000002];
intmain()
for(
int i=
0;iint ans=0;
for(
int i=
0;i)} cout
}
//c++11支援unordered_map
//桶排
#include
#include
#include
//c++11支援
using
namespace std;
vector<
int>p[4]
;int
main()
for(
int i=
0;ilong
long ans=0;
for(
int i=
0;i)} cout
}
//二分查詢個數
#include
//#includevector太不友好了,當陣列很大時不要開,因為擴容需要時間!!
#include
#include
#include
using
namespace std;
vector<
long
long
>p[4]
;long
long e[
100000002];
intbinary
(long
long num,
int k)
else
if(e[mid]
>num) r=mid-1;
else l=mid+1;
}int ll=0;
int rr=k-1;
int ansr=-1
;while
(ll<=rr)
else
if(e[mid]
>num) rr=mid-1;
else ll=mid+1;
}if(ansr!=-1
&&ansl!=-1
)return ansr-ansl+1;
return0;
}int
main()
int k=0;
for(
int i=
0;isort
(e,e+k)
;long
long ans=0;
for(
int i=
0;i)} cout
}
leetcode 三數之和為0
題目描述 給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 具體思路 ...
演算法題解4 三數之和
tags 三層迴圈 雙指標 給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。示例 給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,...
三數之和為0(leetcode 15)
給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 解題思路 講解1 首...