A1048 Find Coins [散列、二分、two pointers]

在这里插入图片描述
题目大意:找出两个数相加刚好为所给的数
思想:散列
注意事项:注意不可以是一个数字在同一个位置,但可以是两个相同的数字在不同位置相加。

#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;
}


posted @ 2020-07-08 15:13  _Hsiung  阅读(96)  评论(0编辑  收藏  举报