其实这个题目如果没有限制时间复杂度的话,那么就很简单了,一遍一遍地扫描吧。时间复杂度肯定就是
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. Redis基础

    Redis是开源的,支持网络.可基于内存也可持久化的key-value数据库,支持主从复制,读写分离,支持5种基本数据类型,高并发性能 安装redis数据库 下载:http://redis.io/do ...

  2. 关于python的__name__理解

    Python中,每个模块有个__name__属性,当模块是在自己文件下执行的,那么它的__name__属性是__main__,而当它被引入到别的模块中,那么在别的模块下(import模块名 可以引入一 ...

  3. 双4G LTE

    我们即将上市的Xplay3S将支持双4G LTE(TDD-LTE+FDD-LTE),那什么是4G LTE呢,今天来给大家科普下4G LTE网络知识. 什么是TDD-LTE/FDD-LTE? LTE是通 ...

  4. 编写一个Car类,具有final类型的属性品牌,具有功能drive; 定义其子类Aodi和Benchi,具有属性:价格、型号;具有功能:变速; 定义主类E,在其main方法中分别创建Aodi和Benchi的对象并测试对象的特 性。

    package b; public class Car { public final static Car pinpai=new Car(); public static Car instance() ...

  5. DataSet.Clear Method ()

    Clears the DataSet of any data by removing all rows in all tables. 需要注意的是这个方法不会清空DataSet中的DataTable, ...

  6. CANopen笔记1

    CAN现场总线只定义了OSI网络模型的第一层(物理层) 和第二层(数据链路层) ,而这两层一般已被CAN硬件完全实现了.由于没有规定应用层,本身并不完整,需要一个高层协议来定义CAN报文中的11/29 ...

  7. [HDU5907]Find Q(水)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5907 记下每块大小,然后n*(n+1)/2 #include <bits/stdc++.h> ...

  8. Strategy策略模式

    策略模式定义了一系列算法,把它们一个个封装起来,并且使它们可相互替换.该模式可使得算法能独立于使用它的客户而变化.Strategy模式是行为模式,正因为他是一种行为模式,所以他不是用来解决类的实例化的 ...

  9. E2 2014.07.01 更新日志

    增加功能   完善功能 电话报修单,添加可以发短信通知客户和技术员选项 商品历程分析,增加按商品分类条件统计 修件库,增加可以按维修商条件过滤,以方便查询某维修商的返修件 维修中,备件转销售时,自动读 ...

  10. box-shadow使用指南

    Summary The box-shadow property describes one or more shadow effects as a comma-separated list. It e ...