4數之和為0(題解)

2021-10-03 21:54:07 字數 1936 閱讀 7666

題意: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 首...