和为s的两个数字 【微软面试100题 第十四题】
题目要求:
输入一个递增排序的数组和一个数字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题 第十四题】的更多相关文章
- 栈的push、pop序列 【微软面试100题 第二十九题】
题目要求: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1是该压栈 ...
- LeetCode刷题:第四题 寻找两个有序数组的中位数
题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 ...
- 《剑指offer》第四十四题(数字序列中某一位的数字)
// 面试题44:数字序列中某一位的数字 // 题目:数字以0123456789101112131415…的格式序列化到一个字符序列中.在这 // 个序列中,第5位(从0开始计数)是5,第13位是1, ...
- P4013 数字梯形问题 网络流二十四题
P4013 数字梯形问题 题目描述 给定一个由 nn 行数字组成的数字梯形如下图所示. 梯形的第一行有 m 个数字.从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形 ...
- 【leetcode 简单】 第八十四题 两个数组的交集
给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2] 示例 2: 输入: nums1 = [4,9,5], ...
- 【leetcode 简单】第三十四题 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...
- 输出1到最大的N位数 【微软面试100题 第六十五题】
题目要求: 输入数字n,按顺序输出从1到最大的n位10进制数. 例如,输入3,则输出1.2.3....999(最大的3位数). 参考资料:剑指offer第12题. 题目分析: 如果我们在数字前面补0的 ...
- 和为n连续正数序列 【微软面试100题 第五十一题】
题目要求: 输入一个正数n,输出所有和为n连续正数序列(至少两个). 例如输入15,由于1+2+3+4+5 = 4+5+6 = 7+8 = 15.所以输出3个连续序列1~5,4~6,7~8. 参考资料 ...
- 链表中倒数第k个结点 【微软面试100题 第十三题】
题目要求: 输入一个链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针. 参考资料:剑指offer第15题 题目分析: 1.两个指针,第一个先走k步,然后两个指针同时走,直到第一个走 ...
随机推荐
- 数据库(数据库、表及表数据、SQL语句)
数据库MYSQL 今日内容介绍 u MySQL数据库 u SQL语句 第1章 数据库 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储 ...
- 使用jdbc完成curd操作
jdbc: java操作数据库,jdbc是oracle公司指定的一套规范(一套接口) 驱动:jdbc的实现类,由数据库厂商提供 我们可以通过一套规范操作不同的数据库(多态) jdbc作用: 连接数据库 ...
- HBase数据模型(2)
HBase数据模型(1) HBase数据模型(2) 1.0 HBase的版本version,是一个用长整型表示的.由Rowkey.Column(列族和列).Version组合在一起称为HBase中的一 ...
- mysql 忘记root密码的解决办法
1.修改MySQL的登录设置: # vim /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables 例如: [mysqld] datadir=/var/lib/m ...
- 【LeetCode】2.Add Two Numbers 链表数相加
题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...
- python基础教程总结8——特殊方法,属性,迭代器,生成器,八皇后问题
1. 重写一般方法和特殊的构造方法 1.1 如果一个方法在B类的一个实例中被调用(或一个属性被访问),但在B类中没有找到该方法,那么会去它的超类A里面找. class A: ... def hello ...
- JAVA小基础
JAVA的jsp程序中,jar如果不能再引用的时候加入到lib文件夹而选择外部引用,可能会导致jar不能被找到的问题. string.format的占位符一般使用%s表示字符串的意思,与C#的{0}这 ...
- SG函数入门&&HDU 1848
SG函数 sg[i]为0表示i节点先手必败. 首先定义mex(minimal excludant)运算,这是施加于一个集合的运算,表示最小的不属于这个集合的非负整数.例如mex{0,1,2,4}=3. ...
- 拨出网线后,网卡IP丢失
/etc/network/interfaces与NetworkManager 问题:在Centos7上把网线拨出后,发现网卡状态是down,并且网卡上的IP丢失 原因:此网卡被NetworkManag ...
- oracle 数据导到 sql server
方法一: navicate:用法比较简单,选择工具-数据传输就可以了.目前测试了下暂时没遇到什么问题. 方法二: Microsoft SQL Server Migration Assistant 8. ...