输入n ( n<= 100,000)个整数,找出其中的两 肯定有解)。题中所有整数都能用 int 表示
来源:互联网 发布:股票主力分析软件 编辑:程序博客网 时间:2024/06/05 11:26
问题内容
输入n ( n<= 100,000)个整数,找出其中的两个数,它们之和等于整数m(假定
肯定有解)。题中所有整数都能用 int 表示
问题分析
1) 将数组排序,复杂度是O(n×log(n))
2) 对数组中的每个元素a[i],在数组中二分查找m-a[i],看
,最坏要查找n-2次,所以查找这部分的复杂度也是O(n
这种解法总的复杂度是O(n×log(n))的。
算法实现
/*输入n ( n<= 100,000)个整数,找出其中的两个数,它们之和等于整数m(假定肯定有解)。题中所有整数都能用 int 表示*//*将数组排序,复杂度是O(n×log(n))对数组中的每个元素a[i],在数组中二分查找m-a[i],看能否找到。复杂度log(n),最坏要查找n-2次,所以查找这部分的复杂度也是O(n×log(n))*//*考虑了数组中元素值重复的问题,已经被选取的元素不能重复选取,引入数组flag做标记,具体看程序 */#include<stdlib.h>#include<iostream>using namespace std;int i=0;int cmp(const void *a,const void *b){ return *(int*)a-*(int*)b;}void SolveQ(int a[],int n,int m){ int l=0,r=0; int mid=0; int flag[100]={0}; int y=0; int z=0; for(i=0;i<n;i++){ y=m-a[i]; if(flag[i]==0){ l=i+1;r=n-1; while(l<=r){ mid=l+(r-l)/2; if(y==a[mid]){ if(flag[mid]==1){ z=mid+1; while(z<n){ if(a[z]==a[mid]){ flag[z]=1; flag[i]=1; cout<<" ("<<i<<","<<z<<") ("<<a[i]<<","<<y<<")"<<endl; break; } z++; } }else{ flag[mid]=1; flag[i]=1; cout<<" ("<<i<<","<<mid<<") ("<<a[i]<<","<<y<<")"<<endl; } break; }else if(y>a[mid]){ l=mid+1; }else if(y<a[mid]){ r=mid-1; } } } if(flag[i]==0){ cout<<"The element "<<a[i]<<" whose index is "<<i<<" cannot match another element"<<endl; } flag[i]=1; }}int main(){ int a[6]={0,0,0,1,0,0}; int n=sizeof(a)/sizeof(a[0]); int m=0; cout<<"sorted array:"<<endl; qsort(a,n,sizeof(int),cmp); for(int i=0;i<n;i++){ cout<<a[i]<<" "; } cout<<endl<<"array subscript element value"<<endl; SolveQ(a,n,m); return 0;}
运行结果
阅读全文
0 0
- 输入n ( n<= 100,000)个整数,找出其中的两 肯定有解)。题中所有整数都能用 int 表示
- 输入n个整数,找出其中最小的k个数
- 输入n个整数,找出其中最小的K个数
- 输入n个整数,找出其中最小的K个数
- 输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数.输入数据有多组,每组占一行,每行的开始是一个整数n,表示这个测试实例的数值的个数,跟着就是n个整数。n=0表示输入的结束,
- 剑指offer_输入n个整数,找出其中最小的K个数
- 输入n个整数,找出其中最小的K个数。——冒泡排序实现方法
- java实现输入n个整数,找出其中最小的K个数
- 程序员面试100题(算法)之输入n个整数,输出其中最小的k个
- 输入n个整数,输出其中最小的k个
- 输入n个整数,输出其中最小的k个
- 输入n个整数,输出其中最小的k个
- 输入n个整数,输出其中最小的k个
- 输入n个整数,输出其中最小的k个
- 输入n个整数,输出其中最小的k个
- 输入n个整数,输出其中最小的k个
- 输入n个整数,输出其中最小的k个
- 输入n个整数,输出其中最小的k个
- Java 中==和 equals 的区别, equals 和 hashCode 的区别
- C++模板实现优先级队列
- Java Filter 和 interceptors 拦截器 综合使用问题
- string stringbuffer stringbuilder 区别
- google protobuf 简单实例
- 输入n ( n<= 100,000)个整数,找出其中的两 肯定有解)。题中所有整数都能用 int 表示
- C语言全局变量与局部变量及存储方式
- Gym
- 16读书笔记之文件存储和SharedPreference存储
- 什么导致线程阻塞
- SUSE Linux以及mysql的安装
- 02-2 JS的基础语法(2)
- CentOS 7 配置网络组
- CSU-ACM2017暑假集训比赛8