题目大意:找出两个数相加刚好为所给的数
思想:散列
注意事项:注意不可以是一个数字在同一个位置,但可以是两个相同的数字在不同位置相加。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
int hashtable[1001] = { 0 };
int n, m, a;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> a;
hashtable[a]++;
}
for (int i = 1; i < m; i++)
{
if (hashtable[i] && hashtable[m - i])
{
if (i == m - i&&hashtable[i]==1)
{
continue;
}
cout << i << " " << m - i << endl;
return 0;
}
}
cout << "No Solution" << endl;
return 0;
}
思想:二分 一个解题思路
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
int a[100001] = { 0 };
int bin(int left, int right, int key)
{
int mid;
while (left <= right)
{
mid = (left + right) / 2;
if (a[mid] == key) return mid;
else if (a[mid] > key) right = mid - 1;
else left = mid+1;
}
return -1;
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
int i;
for (i = 0; i < n; i++)
{
int pos=bin(i, n - 1, m-a[i]);
if (pos != -1 && i != pos)
{
cout << a[i] << " " << a[pos] << endl;
break;
}
}
if (i == n)
{
cout << "No Solution" << endl;
}
}
two pointers:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<time.h>
using namespace std;
const int maxn = 1000001;
long long int a[maxn], b[maxn], c[maxn];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
int i = 0, j = n - 1;
while (i < j)
{
if (a[i] + a[j] < m)
i++;
else if (a[i] + a[j] > m)
j--;
else
break;
}
if (i != j)
cout << a[i] << " " << a[j] << endl;
else
cout << "No Solution" << endl;
}