1. 程式人生 > >51nod 1267 4個數和為0 思路:哈希map+避免重復的點

51nod 1267 4個數和為0 思路:哈希map+避免重復的點

its std 存在 main 空間復雜度 們的 哈希 i++ int

題目:

技術分享

總結大佬們的思路:

思路1:所有數兩兩求和,存入map中,每次判斷有沒有相反數被標記過。

思路2:對所有數排序,排完所有數兩兩求和,結果正好是排好序的。然後掃一遍,二分查找看之前有沒有相反數存在。

思路1時間復雜度O(n^2),空間復雜度O(n^2)

思路2時間復雜度O(n^2log(n)),空間復雜度O(n^2)

兩個都可以過,不卡時間。

要註意的一點是,要標記是哪兩個數的和。

否則可能會重復計算某個數,這就不是四個數的和為0了。

代碼:

#include <bits\stdc++.h> 
using namespace std;
typedef 
long long ll; //l表示較小的索引,r表示較大的索引 //用來判斷是否重復 struct node{ int l;int r; }; int a[1010]; map<ll,node> m; int main() { int n; cin >> n; for(int i = 0;i < n; i++){ cin >> a[i]; } for(int i = 0;i < n; i++){ for(int j = i+1;j < n; j++){ ll k
= a[i]+a[j]; //如果m[-k](當前和的相反數)沒有被標記過 if(m[-k].l != 0||m[-k].r != 0){ //如果m[-k]不重復 if(m[-k].l != i && m[-k].r != i && m[-k].l != j && m[-k].r != j){ cout << "Yes" << endl;
return 0; } } node x; x.l = i;x.r = j; m[k] = x; } } cout << "No" << endl; return 0; } // writen by zhangjiuding

雖然代碼過了,但是有一種情況沒有考慮到,可能是數據比較弱。

就是m[k]可能要存多組不同的索引,代碼起碼要增加十幾行。

51nod 1267 4個數和為0 思路:哈希map+避免重復的點