1.和leetcode的two sum一样
2.采用哈希表记录已经遍历过的数据,target=pay-num[i],查找num[target]是否在哈希表中有,如果有,则压进ans容器,最后进行排序输出;
3.时间复杂度为o(n)
AC代码如下:
#include <iostream>
#include <stdio.h>
#include <vector>
#include <stack>
#include <algorithm>
#include <memory.h>
#include <map>
#include <set>
#include "limits.h"
using namespace std;
/*
8 15
1 2 8 7 2 4 11 15
7 14
1 8 7 2 4 11 15
*/
bool cmp(const pair<int,int>&a,const pair<int,int>&b)
{
return a.first<b.first;
}
int main(void)
{
int coinSum,pay;
scanf("%d %d",&coinSum,&pay);
int *coin=new int[coinSum];
int target;
int *haveCoin=new int[501];
memset(haveCoin, 0, sizeof(haveCoin));
vector<pair<int,int>> ans(0);
for(int i=0;i<coinSum;i++)
{
scanf("%d",&coin[i]);
target=pay-coin[i];
if(target>=0&&target<=500&&haveCoin[target]>0)
{
int a=min(coin[i],target);
int b=pay-a;
ans.push_back({a,b});
}
haveCoin[coin[i]]++;
}
sort(ans.begin(),ans.end(),cmp);
if(ans.size()>0)
printf("%d %d\n",ans[0].first,ans[0].second);
else
printf("No Solution\n");
return 0;
}