面试题41:和为s的两个数字 || 和为s的连续正数序列
和为s的两个数字
题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
有点类似于夹逼的思想
注意两个int相加的和要用long long类型比较规范
bool FindNumbersWithSum(int data[], int length, int sum,
int* num1, int* num2)
{
if (data == NULL || length < )
return false; int i = ;
int j = length - ;
while (i < j)
{
long long tempSum = data[i] + data[j];
if (tempSum == sum)
{
*num1 = data[i];
*num2 = data[j];
return true;
}
else if (tempSum > sum)
j--;
else
i++;
}
return false;
}
和为s的连续正数序列
题目:输入一个正数S,打印出所有和为S的连续正数序列(至少有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5,4~6和7~8.
有了解决前面问题的经验,这里也考虑两个数small和big分别表示序列的最小值和最大值。
首先把small初始化为1,big初始化为2.如果从small到big的序列的和大于S,可以从序列中去掉较小的值,也就是增大small的值。
如果从small到big的序列的和小于S,可以增大big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,我们一直增加small到(1+S)/2为止。
void FindContinuousSequence(int sum)
{
if(sum < )
return; int small = ;
int big = ;
int middle = ( + sum) / ;
int curSum = small + big; while(small < middle)
{
if(curSum == sum)
PrintContinuousSequence(small, big); while(curSum > sum && small < middle)
{
curSum -= small;
small++; if(curSum == sum)
PrintContinuousSequence(small, big);
} big++;
curSum += big; }
} void PrintContinuousSequence(int small, int big)
{
for(int i = small; i <= big; ++i)
printf("%d ", i);
printf("\n");
}
普通方法:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int> > result;
int i = ;
int j;
while (i <= sum / )
{
int j = i + ;
int curSum = i + j;
while (curSum <= sum)
{
if (curSum == sum)
{
vector<int> tmp;
for (int q = i; q <= j; q++)
tmp.push_back(q);
result.push_back(tmp);
break;
}
else
{
j++;
curSum += j;
}
}
i++;
}
return result;
}
高效率:
面试题41:和为s的两个数字 || 和为s的连续正数序列的更多相关文章
- 面试题 41 和为s的两个数字VS 和为S的连续整数序列
(1)和为S的两个数字 bool findNumberWithSum(int data[], int length, int sum, int &numb1, int &numb2){ ...
- 和为s的两个数字 和为s的连续正数序列
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s,如果有多对数字的和等于s,输出任意一对即可. #include <iostream> using namesp ...
- 和为S的两个数VS和为S的连续正数序列
其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧.时间复杂度肯定就是 O(n2)啰.但是这题目肯定不会这么简单,否则就是小学生的水平了嘛. 其实我刚到这题的时候想到的是用二叉查 ...
- 【剑指offer】面试题41:和为 s 的两个数字 VS 和为 s 的连续正数序列
题目: 输出所有和为S的连续正数序列.序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 思路: small代表序列最小数字,large代表序列最大数字.初始化small为1,large为2. ...
- 面试题41:和为s的两个数字VS和为s的连续正数序列
题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和为s,输出任意一对即可. vector<int> findNumberwWithSu ...
- 【面试题041】和为s的两个数字VS和为s的连续正数序列
[面试题041]和为s的两个数字VS和为s的连续正数序列 题目一: 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输出任意一对即可. ...
- [剑指Offer]41.和为S的两个数字 VS 和为S的连续正数序列
[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列 Leetcode T1 Two Sum Given an array of integers, return indices of ...
- (剑指Offer)面试题41:和为s的连续正数序列
题目: 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数).例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1-5,,4-6和7-8. 思路: ...
- 和为S的两个数字VS和为s的连续正数序列
题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输出任意一对即可. 例如输入数组1.2.4.7.11.15和数字15.由于4+11=15, ...
随机推荐
- [Leetcode] Backtracking回溯法解题思路
碎碎念: 最近终于开始刷middle的题了,对于我这个小渣渣确实有点难度,经常一两个小时写出一道题来.在开始写的几道题中,发现大神在discuss中用到回溯法(Backtracking)的概率明显增大 ...
- SFTP上传下载文件、文件夹常用操作
SFTP上传下载文件.文件夹常用操作 1.查看上传下载目录lpwd 2.改变上传和下载的目录(例如D盘):lcd d:/ 3.查看当前路径pwd 4.下载文件(例如我要将服务器上tomcat的日志文 ...
- VS2010(32bit) + WIN7(64bit) 编译出不同平台程序版本
一.X86,即一般普通PC上跑的程序版本,不用修改工程属性 二.X64 1.设置工程平台---会在工程目录下生成 X64 文件夹 在工具栏--->生成--->配置管理器 窗口 设置“活动 ...
- 科学计算三维可视化---Mlab基础(常用控制函数)
- python---django的模块简便使用
一:登录操作 from django.contrib.auth import authenticate,login,logout #可以用来做登录验证 from django.contrib.auth ...
- PHP常亮
define('PI','3.14'); echo PI; 名字大写,创建后不能修改和销毁 销毁变量用unset()
- linux ln链接详解
1.序 Linux具有为一个文件起多个名字的功能,称为链接.被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份.另外,被链接的文件也可以有相同的文件名,但是 ...
- Redis学习五:Redis的持久化-RDB
RDB(Redis DataBase) 一.是什么 1.概念:在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里 2.执行方式: R ...
- JavaScript实现单向链表
JavaScript 本身提供了十分好用的数据类型,以满足大家的日常使用.单靠 Array 和 Object 也的确足够应付日常的绝大部分需求,这也导致了很多前端er对数据结构这一块不是十分的了解. ...
- 【CodeForces】914 F. Substrings in a String bitset
[题目]F. Substrings in a String [题意]给定小写字母字符串s,支持两种操作:1.修改某个位置的字符,2.给定字符串y,查询区间[l,r]内出现y多少次.|s|,Σ|y|&l ...