careercup-中等难度 17.12
17.12 设计一个算法,找出数组中两数之和为指定值的所有整数对。
解答
时间复杂度O(n)的解法
我们可以用一个哈希表或数组或bitmap(后两者要求数组中的整数非负)来保存sum-x的值, 这样我们就只需要遍历数组两次即可找到和为指定值的整数对。这种方法需要O(n) 的辅助空间。如果直接用数组或是bitmap来做,辅助空间的大小与数组中的最大整数相关, 常常导致大量空间浪费。比如原数组中有5个数:1亿,2亿,3亿,4亿,5亿。sum为5亿, 那么我们将bitmap中的sum-x位置1,即第4亿位,第3亿位,第2亿位,第1亿位,第0位置1. 而其它位置都浪费了。
如果使用哈希表,虽然不会有大量空间浪费,但要考虑冲突问题。
时间复杂度为O(nlogn)的解法
我们来考虑一种空间复杂度为O(1),而且实现也很简单的算法。首先,将数组排序。 比如排序后得到的数组a是:-2 -1 0 3 5 6 7 9 13 14。然后使用low和high 两个下标指向数组的首尾元素。如果a[low]+a[high] > sum,那么说明a[high] 和数组中的任何其它一个数的和都一定大于sum(因为它和最小的a[low]相加都大于sum)。 因此,a[high]不会与数组中任何一个数相加得到sum,于是我们可以直接不要它, 即让high向前移动一位。同样的,如果a[low]+a[high] < sum,那么说明a[low] 和数组中的任何其它一个数的和都一定小于sum(因为它和最大的a[high]相加都小于sum)。 因此,我们也可以直接不要它,让low向前移动一位。如果a[low]+a[high]等于sum, 则输出。当low小于high时,不断地重复上面的操作即可。
C++实现代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std; vector<vector<int> > getSum(vector<int> &num,int target)
{
sort(num.begin(),num.end());
int i,j;
vector<vector<int> > res;
i=;
j=num.size()-;
while(i<j)
{
if(num[i]+num[j]==target)
{
res.push_back({num[i],num[j]});
j--;
i++;
}
else if(num[i]+num[j]<target)
{
i++;
}
else if(num[i]+num[j]>target)
{
j--;
}
}
return res;
} int main()
{
vector<int> numbers={,,,,,,,,,,,,,,,,,,};
vector<vector<int> > res=getSum(numbers,);
for(auto a:res)
{
for(auto t:a)
cout<<t<<" ";
cout<<endl;
}
}
careercup-中等难度 17.12的更多相关文章
- [CareerCup] 17.12 Sum to Specific Value 和为特定数
17.12 Design an algorithm to find all pairs of integers within an array which sum to a specified val ...
- OC语言实现中等难度通讯录
实现中等难度通讯录.需求: 1.定义联系⼈人类Contact.实例变量:姓名(拼⾳音,⾸首字⺟母⼤大写).性别.电话号码. 住址.分组名称.年龄.⽅方法:⾃自定义初始化⽅方法(姓名.电话号码).显⽰示 ...
- CodeBlocks(17.12) 代码调试基础方法&快捷方式
转载:CodeBlocks(17.12) 代码调试基础方法&快捷方式: https://www.cnblogs.com/DCD112358/p/8998053.html
- DPDK安装方法 17.12.13
DPDK安装方法 17.12.13 Ubuntu: $ git clone https://github.com/DPDK/dpdk.git $ cd dpdk/ $ export RTE_ARCH= ...
- careercup-中等难度 17.6
17.6 给定一个整数数组,编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的.注意:n越小越好,也就是说,找出符合条件的最短序列. 解法: 开始解题之前,让我们先确认一下 ...
- careercup-中等难度 17.11
17.11 给定rand5(),实现一个方法rand7().也即,给定一个产生0到4(含)随机数的方法,编写一个产生0到6(含)随机数的方法. 解法: 这个函数要正确实现,则返回0到6之间的值,每个值 ...
- careercup-中等难度 17.9
17.9 设计一个方法,找出任意指定单词在一本书中的出现频率. 解法: 1 单次查询 遍历这本书的每个单词,计算给定单词出现的次数.时间复杂度O(n),我们无法继续优化它,因为书中的每个单次都需要访问 ...
- careercup-中等难度 17.8
17.8 给定一个整数数组(有正数和负数),找出总和最大的连续序列,并返回总和. 解法: 就是求连续子序列的和最大,不过存在一个问题: 假设整个数组都是负数,怎么样才是正确的行为呢?看看这个简单的数组 ...
- careercup-中等难度 17.7
17.7 给定一个整数,打印该整数的英文描述(例如“One Thousand,Two Hundred Thirty Four”). 解法: 举个例子,在转换19 323 984时,我们可以考虑分段处理 ...
随机推荐
- 最受 Web 开发者欢迎的 NoSQL 和关系数据库
Web应用离不开数据库,目前市场上有种类繁多数据库可供开发者选择,例如SQL.NoSQL.键值.图谱数据库等等.关于不同数据库在开发者中的受欢迎程度也是仁者见仁智者见智,但是通过统计亚马逊这样的公共云 ...
- JQuery向ashx提交中文参数方案
客户端://异步获取数据var tpAction=action+'getSearch.ashx?key='+encodeURIComponent('中国'); $.getJSON(tpAction,f ...
- spinner 设置文本框中的字体颜色
onItemSelected(AdapterView parent, View v, int position, long id) { TextView v1 = (TextView)v; v1.se ...
- [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.4.6
Let $A$ and $B$ be two matrices (not necessarily of the same size). Relative to the lexicographicall ...
- POJ 3107-Godfather(树形dp)
题意: 有n个节点的树,删除一个点,得到的最大联通分支最小,求这样点的集合 分析: dp[i]表示删除i所得最大联通分支,遍历一遍节点即可,该题用vector会超时 #include <map& ...
- CDH 5.5.1 Yum源服务器搭建
CDH 5.5.1 Yum源服务器搭建 下载Cloudera Repo #下载资源仓库repo wget https://archive.cloudera.com/cdh5/redhat/6/x86_ ...
- JQuery原理
1.简单模拟JQuery工作原理 (function(window){ var JQuery ={ a: function(){ alert('a'); }, b: function(){ alert ...
- Java之序列流SequenceInputStream
序列流:作用就是将多个读取流合并成一个读取流,实现数据的合并 序列流表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从第一个输入流开始读取,直到文件的末尾,接着从第二个输入流读取,以此类推:这样 ...
- python 安装第三方模块
在Python中,安装第三方模块,是通过setuptools这个工具完成的. 如果你正在使用Mac或Linux,安装setuptools本身这个步骤就可以跳过了. 如果你正在使用Windows,请首先 ...
- React-native 中的触摸响应功能
我们在做APP的时候,与桌面应用系统不同的是触摸响应. web页面对触摸响应的支持和原生的APP有着很大的差异. 基本用法 componentWillMount: function() { this. ...