#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
/*
问题:设计一个算法,找出数组中两数之和为指定值的所有整数对。
分析:如果数组直接用无序的做,时间复杂度为O(n^2),对每个整数,遍历剩余整数。
如果先对数组排序,然后一个从左边,一个从右边,向中间遍历,时间复杂度为:排序时间复杂度O(NlogN),两边向中间遍历时间O(N),
所以最终时间为O(NlogN)。
因此,先排序,然后夹逼来做
输入:
8(数组元素个数n,接下来一行是输入的n个元素) 9(两数之和)
1 8 5 7 6 3 4 5
输出:
1 8,3 6,4 5
*/
vector< pair<int , int> > getPair(vector<int>& datas, int value)
{
vector< pair<int, int> > results;
if(datas.empty())
{
return results;
}
sort(datas.begin() , datas.end());
int low = 0;
int high = datas.size() - 1;
while(low < high)
{
//如果 左边+右边 > 和, 右边下标减少; 左边+右边 < 和 , 左边下标累加 ; 左边+右边= 和, 左边下标累加,右边下标累减
if( datas.at(low) + datas.at(high) > value )
{
high--;
}
else if( datas.at(low) + datas.at(high) < value )
{
low++;
}
else
{
pair<int , int> result(datas.at(low) , datas.at(high));
results.push_back(result);
high--;
low++;
}
}
return results;
}
void printResult(vector< pair<int ,int> >& results)
{
vector< pair<int ,int> >::iterator it;
int count = 0;
int size = results.size();
for(it = results.begin() ; it != results.end() ; it++)
{
if(count != 0)
{
cout << "," << it->first << " " << it->second;
}
else
{
cout << it->first << " " << it->second;
}
count++;
}
cout << endl;
}
void process()
{
int num;
int sumValue;
int value;
vector<int> datas;
vector< pair<int ,int> > results;
while(cin >> num >> sumValue)
{
for(int i = 0 ; i < num ; i++)
{
cin >> value;
datas.push_back(value);
}
results = getPair(datas , sumValue);
printResult(results);
}
}
int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}
程序员面试金典——解题总结: 9.17中等难题 17.12设计一个算法,找出数组中两数之和为指定值的所有整数对。
最新推荐文章于 2022-05-17 21:29:26 发布