程序员面试金典——解题总结: 9.17中等难题 17.12设计一个算法,找出数组中两数之和为指定值的所有整数对。
2017-01-17 15:06
531 查看
#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.9设计一个方法,找出任意指定单词在一本书中的出现频率
- 程序员面试金典——解题总结: 9.17中等难题 17.6给定一个整数数组,编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意:n - m越小越好,也就是说,找出
- 程序员面试金典——解题总结: 9.17中等难题 17.8给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和
- 程序员面试金典——解题总结: 9.17中等难题 17.3设计一个算法,算出n阶乘有多少个尾随0
- 程序员面试金典——解题总结: 9.17中等难题 17.7给定一个整数,打印该整数的英文描述(例如 "One Thousand,Two Hundred-Thirty Four")
- 程序员面试金典——解题总结: 9.17中等难题 17.4编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。
- 程序员面试金典——解题总结: 9.17中等难题 17.11给定rand5(),实现一个方法rand7()。也就是,给定一个产生0到4(含)随机数的方法,编写一个产生0到6(含)随机数的方法
- 程序员面试金典——解题总结: 9.17中等难题 17.1编写一个函数,不用临时变量,直接交换两个数
- 程序员面试金典——解题总结: 9.18高难度题 18.11给定一个方阵,其中每个单元(像素)非黑即白。设计一个算法,找出四条边都是黑色像素的最大子方阵。
- 程序员面试金典——解题总结: 9.18高难度题 18.6设计一个算法,给定10亿数字,找出最小的100万个数字。假定计算机内存足以容纳全部10亿个数字。
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
- 程序员面试金典——解题总结: 9.17中等难题 17.14句子分割
- 找出数组中两数之和为指定值的所有整数对
- 程序员面试金典——解题总结: 9.18高难度题 18.13给定一份几百万个单词的清单,设计一个算法,创建由字母组成的最大矩形
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
- 程序员面试金典——解题总结: 9.18高难度题 18.3编写一个方法,从大小为n的数组中随机选出m个整数。要求每个元素被选中的概率相同。
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- [算法学习]给定一个整型数组,找出两个整数为指定整数的和(3)
- 整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合