在1~n个数中,找到某两个数的和等于另一数
第一种方法:两重for循环暴力,时间复杂度O(n*n)
第二种:使用二分,分别从首尾出发。时间复杂度O(n*logn)。当非排序时,需要先排序。
/* ***********************************************
Author :bo-jwolf
Created Time :2015年02月21日 星期六 22:24:59
File Name :311.cpp
************************************************ */
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int MAX = 1005;
int num[ MAX ], n, m;
void Find( int *num, int Value ){
int l = 1, r = n;
if( num == NULL ?? l < 1 && r > n )
return;
while( l < r ){
int mid = ( l + r ) >> 1;
if( num[ l ] + num[ r ] == Value ){
cout << num[ l ] << " " << num[ r ] << endl;
l++;
r--;
}
else if( num[ l ] + num[ r ] > Value ){
r--;
}
else{
l++;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while( cin >> n ){
for( int i = 1; i <= n; ++i ){
cin >> num[ i ];
}
cin >> m;
Find( num, m );
}
return 0;
}
第三种方法:Hash表,将数据存储在Hash表中,然后查找是否存在num[ value – num[ i ] ]。时间复杂度O(n+m)
/* ***********************************************
Author :bo-jwolf
Created Time :2015年02月21日 星期六 22:33:22
File Name :311a.cpp
************************************************ */
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int MAX = 1005;
int num[ MAX ];
int n, m;
map<int,int> Hash;
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while( cin >> n ){
for( int i = 1; i <= n; ++i )
cin >> num[ i ];
for( int i = 1; i <= n; ++i )
Hash.insert( pair< int, int > ( num[ i ], num[ i ] ) );
cin >> m;
for( int i = 1; i <= n; ++i ){
if( Hash.find( m - num[ i ] ) != Hash.end() ){
cout << num[ i ] << " " << m - num[ i ] << endl;
}
}
}
return 0;
}