题目

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

思路

  我们先在数组中选择两个数字,如果它们的和等于输入的 s,我们就找到了要找的两个数字。如果和小于 s 呢?我们希望两个数字的和再大一点。由于数组已经排好序了,我们可以考虑选择较小的数字后面的数字。因为排在后面的数字要大一些,那么两个数字的和也要大一些, 就有可能等于输入的数字 s 了。同样, 当两个数字的和大于输入的数字的时候,我们可以选择较大数字前面的数字,因为排在数组前面的数字要小一些。

#include <iostream>
#include <vector>
using namespace std; class Solution
{
public:
void find_num_with_sum(const vector<int> &v,const int &sum);
}; void Solution::find_num_with_sum(const vector<int> &v,const int &sum)
{
if(v.size()<=||v.empty())
return; vector<int>::const_iterator begin=v.begin();
vector<int>::const_iterator end=--v.end(); while(begin<end)
{
if((*begin+*end)==sum)
{
cout<<*begin<<'\t'<<*end<<endl;
break;
}
else if((*begin+*end)<sum)
++begin;
else
--end;
}
}
int main()
{
vector<int> v{,,,,,};
Solution s;
s.find_num_with_sum(v,);
return ;
}

code

class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> arr,int sum) {
if(arr.size()==)
return {};
else if(arr[]>sum)
return {}; int i=,j=arr.size()-;
vector<int> res;
while(i<j)
{
if(arr[i]+arr[j]==sum)
{
res.push_back(arr[i]);
res.push_back(arr[j]);
break;
}
if(i<j&&arr[i]+arr[j]>sum)
--j;
if(i<j&&arr[i]+arr[j]<sum)
++i;
}
return res;
}
};

题目

  输入一个正数 s,打印出所有和为 s 的连续正数序列(至少两个数)

思路

  考虑用两个数 small 和 big 分别表示序列的最小值和最大值。首先把 small 初始化为 1,big 初始化为 2。如果从 small 到 big 的序列的和大于 s,我们可以从序列中去掉较小的值,也就是增大 small 的值。如果从 small 到 big 的序列的和小于 s,我们可以增大 big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,我们一直增加 small 到(1+s)/2 为止。

#include <iostream>
#include <vector>
using namespace std; class Solution
{
public:
void find_sequence(const int &sum);
};
void Solution::find_sequence(const int &sum)
{
if(sum<=)
return; int small=;
int big=;
int middle=(sum+)/;
int curr_sum=small+big; while(small<middle)
{
if(curr_sum==sum)
{
for(int i=small;i<=big;++i)
cout<<i<<'\t';
cout<<endl;
} while(curr_sum<sum&&small<middle)
{
++big;
curr_sum+=big;
if(curr_sum==sum)
{
for(int i=small;i<=big;++i)
cout<<i<<'\t';
cout<<endl;
break;
}
}
curr_sum-=small;
++small;
}
}
int main()
{
Solution s;
s.find_sequence();
return ;
}

code2

class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
if(sum<)
return {}; int smallNum=,bigNum=;
vector<vector<int>> res;
while(smallNum<bigNum)
{
int curSum=(smallNum+bigNum)*(bigNum-smallNum+)/;
if(curSum<sum)
++bigNum; if(curSum==sum)
{
vector<int> tmp;
for(int i=smallNum;i<=bigNum;++i)
tmp.push_back(i);
res.push_back(tmp);
++smallNum;
} if(curSum>sum)
++smallNum;
}
return res;
}
};

拓展

  通常用循环求一个连续序列的和,但每次操作后的序列和操作之前的序列比大部分都是一样的,只是增加或减少了一个数字,因此可以再之前的序列基础上求后一个序列。

和为 s 的两个数字(和为 s 的连续正数序列)的更多相关文章

  1. 面试题41:和为s的两个数字 || 和为s的连续正数序列

    和为s的两个数字 题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输出任意一对即可. 有点类似于夹逼的思想 注意两个int相加的和要用lo ...

  2. 和为s的两个数字 和为s的连续正数序列

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

  3. 和为S的两个数VS和为S的连续正数序列

    其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧.时间复杂度肯定就是 O(n2)啰.但是这题目肯定不会这么简单,否则就是小学生的水平了嘛. 其实我刚到这题的时候想到的是用二叉查 ...

  4. 和为S的两个数字VS和为s的连续正数序列

    题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输出任意一对即可. 例如输入数组1.2.4.7.11.15和数字15.由于4+11=15, ...

  5. 【面试题041】和为s的两个数字VS和为s的连续正数序列

    [面试题041]和为s的两个数字VS和为s的连续正数序列 题目一:     输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输出任意一对即可. ...

  6. 【剑指offer】面试题41:和为 s 的两个数字 VS 和为 s 的连续正数序列

    题目: 输出所有和为S的连续正数序列.序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 思路: small代表序列最小数字,large代表序列最大数字.初始化small为1,large为2. ...

  7. 面试题41:和为s的两个数字VS和为s的连续正数序列

    题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和为s,输出任意一对即可. vector<int> findNumberwWithSu ...

  8. [剑指Offer]41.和为S的两个数字 VS 和为S的连续正数序列

    [剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列 Leetcode T1 Two Sum Given an array of integers, return indices of ...

  9. 面试题 41 和为s的两个数字VS 和为S的连续整数序列

    (1)和为S的两个数字 bool findNumberWithSum(int data[], int length, int sum, int &numb1, int &numb2){ ...

随机推荐

  1. Form嵌入到Panel里(C#)

    直接把这个 Form嵌入到一个 Panel中即可. 示例如下: 要嵌入的 Form: public partial class FormEmbed : Form { public FormEmbed( ...

  2. quartz---的一个简单例子

    quartz---的一个简单例子 首先建立一个maven项目.jar工程即可.(提示:我前面有如何建立一个maven工程的总结以及maven环境的配置.) 1.建立好后点击到app中运行,--> ...

  3. iOS UI-IOS开发中Xcode的一些使用技巧

    一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n     新建项目 cmd + n             新建文件 视图 option + cmd + 回车 打开助理编 ...

  4. 微信小程序--登录流程梳理

    前言 微信小程序凡是需要记录用户信息都需要登录,但是也有几种不同的登录方式,但是在小程序部分的登录流程是一样的.之前就朦朦胧胧地用之前项目的逻辑改改直接用了,这个新项目要用就又结合官方文档重新梳理了下 ...

  5. vue中上传文件相同文件名没反应

    vue项目中会遇到上传文件的需求,jquery会有一些插件很方便,如果不使用插件网上的方法没有太容易的而且很多是原生JS或者基于jQuery操作dom结构的.那么在vue项目中如何实现呢,还有如何模拟 ...

  6. Netty高性能编程备忘录(下)

    估计很快就要被拍砖然后修改,因此转载请保持原文链接,否则视为侵权... http://calvin1978.blogcn.com/articles/netty-performance.html 前文再 ...

  7. selenium(四)操作cookie,伪造cookie

    简介: Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据. 常见的用途就是保留用户登陆信息,登陆时的7天免登陆,记住 ...

  8. call、apply的应用

    call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来 ...

  9. 玩转X-CTR100 l STM32F4 l HMC5983/HMC5883L三轴磁力计传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 扩展HMC ...

  10. Python与系统的交互方式

    本节内容 os与commands模块 subprocess模块 subprocess.Popen类 总结 我们几乎可以在任何操作系统上通过命令行指令与操作系统进行交互,比如Linux平台下的shell ...