hash表
// 方法1 hash表 o(n)
#include <iostream>
#include <algorithm>
#include <unordered_set>
using namespace std;
int n, m;
int main(){
scanf("%d%d", &n, &m);
unordered_set<int> h;
int v1 = INF, v2;
for (int i = 0; i < n; i ++){
int a, b;
scanf("%d", &a);
b = m - a;
if (h.count(b)){
if (a > b) swap(a, b);
if (a < v1) v1 = a, v2 = b;
}
h.insert(a);
}
if (v1 == INF) puts("No Solution");
else printf("%d %d\n", v1, v2);
return 0;
}
双指针 从小到大排序
// 方法2 排序 双指针 o(n)
#include <iostream>
#include <algorithm>
#include <unordered_set>
using namespace std;
const int N = 100010;
int w[N];
int n, m;
int main(){
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i ++){
scanf("%d", &w[i]);
}
sort(w, w + n);
for (int i = 0, j = n - 1; i < j; i ++ ){
while (i < j && w[i] + w[j] > m) j --;
if (i < j && w[i] + w[j] == m){
printf("%d %d\n", w[i], w[j]);
return 0;
}
}
puts("No Solution");
return 0;
}