• 【6】连续序列和为s


    题目:输入一个整数s,打印出全部和为s的连续整数序列(至少含有2个数)。比如输入9,则输出2、3、4和4、5两个序列


    方案一:因为序列至少要2个数,则两个数上限值为(1+s)/2,我们能够枚举该序列的起点和终点求全部满足的序列。时间复杂度为O(n^2),效率比較低

    方案二:我们设置两个指针start和end分别表示当前序列的起点和终点,并记序列和为sum。当sum = s的时候输出这个序列,而且end往后移动一位;假设sum > s,则start往后移动一位;假设sum < s,则end要往后移动一位。

                  直到start < (1+s)/2结束循环,时间复杂度O(n),效率非常高


    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    //打印序列
    void PrintNum(int start, int end){
    	for(int i = start; i <= end; i++){
    	    printf("%d ", i);
    	}
    	printf("
    ");
    }
    
    //找到两个数和为s
    void FindSequenceSum(int s){
    	if(s < 3){ //和小于3是不合法的数据
    	    return;
    	}
    	int start = 1;
    	int end = 2;
    	int sum = 3;
    	int mid = (1+s)>>1;
    	//循环找到全部的序列
    	while(start < mid){ //序列的起点要小于(1+s)的一半
    		if(sum == s){ //和为sum的序列直接打印
    		    PrintNum(start, end);
    		    end++;
    		    sum += end;
    		}
    		else if(sum > s){ //和大于s的序列则起始点往后移动一个
    		    sum -= start;
    		    start++;
    		}
    		else{ //和小于s的序列则终点往后移动一位
    		    end++; 
    		    sum += end;
    		}
    	}
    }
    
    int main(){
    	FindSequenceSum(9);
    	getchar();
    	return 0;
    }
    


  • 相关阅读:
    Hbase JavaApi
    面向对象特征之继承
    重写(Override)与重载(Overload)
    数组排序
    EL表达式
    java异常
    业务代码与非业务代码
    设计思想之高内聚低耦合
    JDBC实现动态查询
    枚举
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3761727.html
Copyright © 2020-2023  润新知