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


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






  • 相关阅读:
    Redis在CentOS和Windows安装过程
    celery在Django中的集成使用
    Celery 框架学习笔记(生产者消费者模式)
    异步任务队列Celery在Django中的使用
    如何使用django+celery+RabbitMQ实现异步执行
    PowerMock+SpringMVC整合并测试Controller层方法
    Python获取指定文件夹下的文件名
    Python中super的应用
    Linux系统(Centos)下安装nodejs并配置环境
    面试题37:序列化二叉树
  • 原文地址:https://www.cnblogs.com/yml435/p/4655470.html
Copyright © 2020-2023  润新知