题目要求:

  输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。

  例如输入数组{1,2,4,7,11,15}和数字15.由于4+11=15,因此输出4和11.

  参考资料:剑指offer第41题

题目分析:

  方法1 穷举法:两个for,时间复杂度O(n^2).

  方法2 二分查找法:逐个遍历选一个数,二分查找选另一个数,时间复杂度O(nlogn).

  方法3 双向扫描+临时数组法:先用输入数字s依次减去原数组a,组成一个新数组b:14、13、11、8、4、0.然后从数组a左边开始,b右边开始扫描,小的移动,直到两个数相等,则找到。a中位置的数为第一个数,b中数的位置对应的a中位置的数为第二个数.

  方法4 hash法:先用数组建立一个hash表。这样,对于一个输入数字,只用遍历一遍数组就可以找到是否有这样的两个数。时间复杂度O(N).空间复杂度O(N).

  方法5 双向扫描:从两端扫描,如果a[i]+a[j]>s,则j--,否则i++,如果最终找到a[i]+a[j] = s,则找到。

代码实现:

#include <iostream>

using namespace std;

typedef struct Pair
{
int i,j;
}Pair; Pair findSum(int *a, int n,int s); int main(void)
{
int a[] = {,,,,,};
int n = sizeof(a)/sizeof(int);
int s = ;
Pair res = findSum(a,n,s);
if(res.i == -)
cout << "not find" << endl;
else
cout << "find it,and the first number is " << res.i << ",the second number is " << res.j <<endl;
return ;
}
//方法5实现
Pair findSum(int *a, int n,int s)
{
//sort(s,s+n); 如果数组非有序的,那就事先排好序 O(N*logN )
int *begin=a;
int *end=a+n-;
Pair TwoNums;
while(begin<end) // 俩头夹逼,或称两个指针两端扫描法,很经典的方法, O(N )
{
if(*begin+*end>s)
{
--end;
}
else if (*begin+*end<s)
{
++begin;
}
else
{
TwoNums.i = *begin;
TwoNums.j = *end;
return TwoNums;
}
}
TwoNums.i = -;
TwoNums.j = -;
return TwoNums;
}

  

和为s的两个数字 【微软面试100题 第十四题】的更多相关文章

  1. 栈的push、pop序列 【微软面试100题 第二十九题】

    题目要求: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1是该压栈 ...

  2. LeetCode刷题:第四题 寻找两个有序数组的中位数

    题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和  ...

  3. 《剑指offer》第四十四题(数字序列中某一位的数字)

    // 面试题44:数字序列中某一位的数字 // 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中.在这 // 个序列中,第5位(从0开始计数)是5,第13位是1, ...

  4. P4013 数字梯形问题 网络流二十四题

    P4013 数字梯形问题 题目描述 给定一个由 nn 行数字组成的数字梯形如下图所示. 梯形的第一行有 m 个数字.从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形 ...

  5. 【leetcode 简单】 第八十四题 两个数组的交集

    给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2] 示例 2: 输入: nums1 = [4,9,5], ...

  6. 【leetcode 简单】第三十四题 只出现一次的数字

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  7. 输出1到最大的N位数 【微软面试100题 第六十五题】

    题目要求: 输入数字n,按顺序输出从1到最大的n位10进制数. 例如,输入3,则输出1.2.3....999(最大的3位数). 参考资料:剑指offer第12题. 题目分析: 如果我们在数字前面补0的 ...

  8. 和为n连续正数序列 【微软面试100题 第五十一题】

    题目要求: 输入一个正数n,输出所有和为n连续正数序列(至少两个). 例如输入15,由于1+2+3+4+5 = 4+5+6 = 7+8 = 15.所以输出3个连续序列1~5,4~6,7~8. 参考资料 ...

  9. 链表中倒数第k个结点 【微软面试100题 第十三题】

    题目要求: 输入一个链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 参考资料:剑指offer第15题 题目分析: 1.两个指针,第一个先走k步,然后两个指针同时走,直到第一个走 ...

随机推荐

  1. cf1027F. Session in BSU(并查集 匈牙利)

    题意 题目链接 $n$个人,每个人可以在第$a_i$天或第$b_i$,一天最多考一场试,问在最优的情况下,最晚什么时候结束 Sol 自己只能想到暴力匈牙利二分图匹配,然而还是被构造数据卡了.. 标算很 ...

  2. ABAP事件分类

    1.报表事件 INITIALIZATION. START-OF-SELECTION. END-OF-SELECTION. 2.选择屏幕事件 在INITIALIZATION和START-OF-SELEC ...

  3. PHP_RAW_POST_DATA特性

    在PHP5.6.x中已废止特性 使用 always_populate_raw_post_data 会导致在填充 $HTTP_RAW_POST_DATA 时产生 E_DEPRECATED 错误. 请使用 ...

  4. HTTP错误码汇总(转)

    响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行.响应码分五种类型,由它们的第一位数字表示:1.1xx:信息,请求收到,继续处理2.2xx:成功,行为被成功地接受.理解和采纳3 ...

  5. opencv中mat矩阵如何debug

    mat img 看type:img.type() rows:img.rows cols:img.cols channels:img.channels(),channels()这是一个函数,和上面两个有 ...

  6. python_87_shelve模块

    'shelve模块是一个简单的key,value将内存数据通过文件持久化的模块,可以持久化任何pickle可支持的python数据格式(只支持pickle)' #序列化,将数据写入文件 import ...

  7. Centos7.3 安装devstack stein版本

    1. 系统准备 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭selinux setenforce 0 sed -i ...

  8. iOS应用架构谈part4-本地持久化方案及动态部署

    前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给我提issue或者PR或者评论区.每一个issue和 ...

  9. Thinkphp5的安装

    很长没有码代码了,现在开始做这件事情的意义已经完全与以前不一样了.因为最近有相当长的一段休息时间,是个学习的好时间啊.之前接触过TP3.2,听说后来的版本有挺大的改动,因此呢,现在终于有时间可以好好的 ...

  10. token验证机制

    最近在vue-cli项目实现登录的过程中用到了token验证,在此总结如下 1. 登录时,客户端通过用户名与密码请求登录 2. 服务端收到请求去验证用户名与密码 3. 验证通过,服务端会签发一个Tok ...