编程之美2.12 快速寻找满足条件的两个数
2013-04-21 15:19
375 查看
1. 快速找出一个数组中的两个数,让这两个数之和等于一个给定的值。
如:5 6 1 4 7 9 8 sum=10
2. 快速找出一个数组中的三个数,让这三个数之和等于一个给定的值。
如:5 6 1 4 7 9 8 sum=15
1、解法一:
空间换时间,采用hash的方法;扫描数组,找出其中最大值max,申请max长度的空间,例:5,6,1,4,7,9,8
max=9;
定义数组 num[0----9]初始化为0,然后扫描数组将num[i]赋值,如果i存在,则num[i]++,否则,num[i]=0.
代码如下:
方法二、先对数组排序,O(NlogN )
然后采用快速排序的思想,i=0,j=N-1,array[i]+array[j]==sum,返回,否则,>sum,则j--, <sum,则i++,O(N)
代码如下:总时间复杂度O(NlogN)
2、解法,设三个数为a,b,c ,和sum,按照上面第二种解法,array[i]+array[j]==sum-c=a+b
如:5 6 1 4 7 9 8 sum=10
2. 快速找出一个数组中的三个数,让这三个数之和等于一个给定的值。
如:5 6 1 4 7 9 8 sum=15
1、解法一:
空间换时间,采用hash的方法;扫描数组,找出其中最大值max,申请max长度的空间,例:5,6,1,4,7,9,8
max=9;
定义数组 num[0----9]初始化为0,然后扫描数组将num[i]赋值,如果i存在,则num[i]++,否则,num[i]=0.
代码如下:
#include<iostream> using namespace std; #define N 10 int main() { int array ; int *num; int i; int max=0; int temp=-1; int count; cout<<"请输入"<<N<<"个数字"<<endl; for (i=0;i<N;i++) { cin>>array[i]; } cout<<"请给定一个SUM:"; cin>>count; num=(int *)malloc(sizeof(int)); for (i=0;i<N;i++) { if (array[i]>max) { max=array[i]; } if (array[i]<0)//数组中有负数的情况 { if (abs(array[i])>=temp) { temp=abs(array[i]); } } } if (max+temp<N) { max=N; temp=0; } num=(int *)realloc(num,sizeof(int)*(max+temp+2)); memset(num,0,sizeof(int)*(max+temp+2));//初始化0 for (i=0;i<N;i++) { if (array[i]>=0) { num[array[i]]++; } else { num[max+abs(array[i])]++; } } for (i=0;i<N;i++) { if (count-array[i]>=0) { if (num[count-array[i]]!=0) { if ((count-array[i])==(array[i])) { if (num[count-array[i]]>=2) { cout<<array[i]<<" "<<count-array[i]; break; } } else { cout<<array[i]<<" "<<count-array[i]; break; } } else { continue; } } else//数组中有负数的情况 { if (num[max+abs(count-array[i])]!=0) { if ((count-array[i])==(array[i])) { if (num[max+abs(count-array[i])]>=2) { cout<<array[i]<<" "<<count-array[i]; break; } } else { cout<<array[i]<<" "<<count-array[i]; break; } } else { continue; } } } if (i==N) { cout<<"不存在"; } cout<<endl; free(num); return 0; }
方法二、先对数组排序,O(NlogN )
然后采用快速排序的思想,i=0,j=N-1,array[i]+array[j]==sum,返回,否则,>sum,则j--, <sum,则i++,O(N)
代码如下:总时间复杂度O(NlogN)
#include<iostream> #include<algorithm> using namespace std; #define N 10 int main() { int array ; int i,j; int sum; cout<<"请输入"<<N<<"个数字"<<endl; for (i=0;i<N;i++) { cin>>array[i]; } cout<<"请给定一个SUM:"; cin>>sum; sort(array,array+N);//O(NlogN) for (i=0,j=N-1;i<j;) { if (array[i]+array[j]==sum) { cout<<array[i]<<" "<<array[j]<<endl; break; } else { if (array[i]+array[j]>sum) { j--; } else { i++; } } } if (i==j) { cout<<"不存在"<<endl; } return 0; }
2、解法,设三个数为a,b,c ,和sum,按照上面第二种解法,array[i]+array[j]==sum-c=a+b
相关文章推荐
- 编程之美2.12 快速寻找满足条件的两个数
- 编程之美-快速寻找满足条件的两个数方法整理
- 快速寻找满足条件的两个数
- 快速寻找满足条件的两个数
- 快速寻找满足条件的两个数(编程之美)
- 编程之美2.12 快速寻找满足条件的两个数
- 快速寻找满足条件的两个数
- 微软面试题:快速寻找满足条件的两个数
- 编程之美_010快速寻找满足条件的两个数
- 快速寻找满足条件的两个数或三个数
- 程序员面试100题之十:快速寻找满足条件的两个数
- 编程之美2.12——快速寻找满足条件的两个数
- 快速寻找满足条件的两个数
- 编程之美快速寻找满足条件的两个数
- 快速寻找满足条件的两个数
- 编程之美-快速寻找满足条件的两个数
- 编程之美读书笔记-快速寻找满足条件的两个数
- 编程之美2.12—快速寻找满足条件的两个数
- 读书笔记之编程之美 - 2.12 快速寻找满足条件的两个数
- 快速寻找满足条件的两个数(待完成)