51nod 1267 4個數和為0 思路:哈希map+避免重復的點
阿新 • • 發佈:2017-10-07
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; typedeflong 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+避免重復的點