其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧。时间复杂度肯定就是
O(n2)啰。但是这题目肯定不会这么简单,否则就是小学生的水平了嘛。
其实我刚到这题的时候想到的是用二叉查找的方法进行。但是可能有点困难。
书上提供的方法固然是很巧妙的。
我们要抓住题目中数组的特点,是排好序的。
我们先定义两个指针。一个指头,一个指尾。

我们来计算start+end=16>15。于是知大了,咋办?
我们将end往后移一位。也就是如下了:

些时 1+11=12<15..咋办?
肯定是将start往后移一位啊。

2+11=13<15还是小了

正好嘛。4+11=15..于是,找到了这个值。


  1. void findTwoDataSumed(int *arr,int Length,int v_sum,int *num1,int *num2){
  2. if(arr==NULL||Length==0){
  3. return;
  4. }
  5. int first=0;
  6. int last=Length-1;
  7. while(first<last){
  8. if(arr[first]+arr[last]>v_sum){
  9. last--;
  10. }
  11. if(arr[first]+arr[last]<v_sum){
  12. first++;
  13. }
  14. if(arr[first]+arr[last]==v_sum){
  15. *num1=arr[first];
  16. *num2=arr[last];
  17. return;
  18. }
  19. }
  20. }

这个题目肯定得用到上面的思想了。
其实我第一眼看到这个题目的时候思路是:
输入15吧。 15/1=15 。要两个数才行。
15/2=8.。那么8是这两个数的平均大小(准确地说是7.5)。于是知我们找到8和7。因为它们不仅连续,而且平均数是7.5.OK
15/3=5.   要求平均数是5哦。肯定是3、4、5不行,5、6、7也不行。4、5、6正好嘛。
15/4=3.75。好复杂的数字。于是我们想。四个数的平均数是3.75.   没有
15/5=3. 正好是1-5
后面的数其本不可能了的,。
你想。15/6=平均数太小了。不存在这样的连续数字。15/7.就更不可能了。

而这个算法的思路是:
    
  1. void findContinueSequenceSum(int v_sum){
  2. if(v_sum<3){
  3. return;
  4. }
  5. int start=1;
  6. int end=2;
  7. int curSum=start+end;
  8. int mid=(v_sum+1)/2;
  9. while(start<mid){
  10. if(curSum==v_sum){
  11. printSeqNum(start,end);
  12. }
  13. if(curSum>v_sum&&start<mid){
  14. curSum-=start;
  15. start++;
  16. if(curSum==v_sum){
  17. printSeqNum(start,end);
  18. }
  19. }
  20. if(curSum<=v_sum&&start<mid){
  21. end++;
  22. curSum+=end;
  23. }
  24. }
  25. }
  26. void printSeqNum(int start,int end){
  27. for(int i=start; i<end; i++){
  28. std::cout<<start<<",";
  29. }
  30. std::cout<<end;
  31. }


和为S的两个数VS和为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的连续正数序列

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

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

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

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

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

  6. 和为 s 的两个数字(和为 s 的连续正数序列)

    题目 输入一个递增排序的数组和一个数字 s,在数组中查找两个数,得它们的和正好是 s.如果有多对数字的和等于 s,输出任意一对即可 思路 我们先在数组中选择两个数字,如果它们的和等于输入的 s,我们就 ...

  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. 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!

    // test20.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

随机推荐

  1. ceil floor函数

    > a=6.4> b=math.ceil(a)> print(b)7> c=math.floor(a)> print(c)6 ceil向上取整 floor向下取整

  2. 南阳oj 求N!的二进制表示最低位的1的位置(从右向左数)。

    N! 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 阶乘(Factorial)是一个很有意思的函数,但是不少人都比较怕它.现在这里有一个问题,给定一个N(0< ...

  3. DLL数据共享在不同处定义效果不同..

    DLL头文件: #ifndef _DLL_SAMPLE_H #define _DLL_SAMPLE_H #pragma data_seg("ShareReadAndWrite") ...

  4. 2016年11月25日 星期五 --出埃及记 Exodus 20:16

    2016年11月25日 星期五 --出埃及记 Exodus 20:16 "You shall not give false testimony against your neighbor.不 ...

  5. linux 强大的编辑器之vi

    vi编辑器是一个处理ASCII数据的文本工具.大多数linux发行版都已经默认安装了vi编辑器.vi是visual interface的缩写vim是 visual interface improved ...

  6. eclipse注释模板

    设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元 ...

  7. HDU 2098 分拆素数和

    HDU 2098 分拆素数和 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768K (Java/Others) [题目描述 ...

  8. h5移动开发css

    最近刚开始做移动端的开发,接触到很多新的东西,很荣幸(*^__^*) , 下面我们开始正式介绍最近新接触到的属性啦,一起进步: 1.点击按钮等会产生阴影,可设置这个属性:-webkit-tap-hig ...

  9. Phantomjs 在cmd命令行显示中文乱码

    cmd命令行窗口显示中文乱码 cmd中文支持gbk编码 在js执行文件中加上(一般在最开始加) phantom.outputEncoding="gbk"; 这样乱码就正确了

  10. winscp 软件。

    winscp 软件.是管理服务器的软件. 我们可以输入ip和password,对服务器上的代码进行管理.