其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧。时间复杂度肯定就是
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. nyoj CO-PRIME 莫比乌斯反演

    CO-PRIME 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 This problem is so easy! Can you solve it? You are ...

  2. sorl维护索引库sorl4j的使用

    1.维护索引库 添加:添加一个json格式的文件就可以. 修改:在solr中没有update,只需要添加一个新的文档,要求文档id和被修改文档的id一致.原理是先删除后添加. 删除:使用xml格式. ...

  3. css公共样式,初始化

    /* CSS Document */ body, button, select, textarea, input, label, option, fieldset, legend{font-famil ...

  4. HDU4549 M斐波那契数列 矩阵快速幂+欧拉函数+欧拉定理

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  5. CAGradientLayer

    参考: CAShapeLayer和CAGradientLayer 一 简介 1,CAGradientLayer,处理颜色渐变: 2,CAGradientLayer的渐变色可以做隐式动画: 3,大部分情 ...

  6. 分别向Set集合以及List集合中添加"A"、"a"、"c"、"C"、"a",观察重复值"a"能否添加成功

    package lianxi; import java.util.*; public class JhSet { public static void main(String[] args) { Se ...

  7. MySQL做练习时总结的一些知识点

    MySQL做练习时总结的一些知识点     0:mysql有三种注释方法 上午插入记录的时候一直没有成功,郁闷不知道为什么.因为是很多条记录一起插入,中间一些不用的数据就用"--" ...

  8. ICP(迭代最近点)算法

    图像配准是图像处理研究领域中的一个典型问题和技术难点,其目的在于比较或融合针对同一对象在不同条件下获取的图像,例如图像会来自不同的采集设备,取自不同的时间,不同的拍摄视角等等,有时也需要用到针对不同对 ...

  9. [C和指针]第三部分

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  10. Codeforces Round #379 (Div. 2) C. Anton and Making Potions 二分

    C. Anton and Making Potions time limit per test 4 seconds memory limit per test 256 megabytes input ...