• 剑指Offer--和为s的连续正数序列


    和为s的连续正数序列

    题目 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?
    输出描述 输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。
    初步思路 划定范围首先1~s/2,后来想着根据奇偶数划分,但是这样似乎太狭隘。再后来感觉和等差求和有点相似,所以就有下面几个限定条件:① s=na1+n(n-1)/2;② a1<=s/2; ③ a1>0;④ n>=2;根据以上四个条件进行查找;采用插入排序将其进行序间排序
    自己写的low代码

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<ArrayList<Integer> > FindContinuousSequence(int s) {
        /*   	ArrayList<ArrayList<Integer>> list = new ArrayList();
    		if (s <= 0) {
    			return list;
    		}
    		int a1 = 0;
    		int n = 2;
    
    		for (;; n++) {
    			a1 = s / n + (1 - n) / 2;
    			if (a1 <= 0 || a1 > s / 2) {
    				break;
    			}
    			int sum = n*a1+n*(n-1)/2;
    			if(sum==s) {
    				ArrayList<Integer> list1= new ArrayList();
    				for(int i=0;i<n;i++) {
    					list1.add(a1+i);
    				}
    				list.add(list1);
    			}
    
    		}
    		return list;*/
            //上面这种不符合序列建按照开始数字从小到大的顺序;
            ArrayList<ArrayList<Integer>> list = new ArrayList();
    		if (s <= 0) {
    			return list;
    		}
    		int a1 = 0;
    		int n = 2;
    
    		for (;; n++) {
    			a1 = s / n + (1 - n) / 2;
    			if (a1 <= 0 || a1 > s / 2) {
    				break;
    			}
    			int sum = n * a1 + n * (n - 1) / 2;
    
    			if (sum == s) {
    				ArrayList<Integer> list1 = new ArrayList();
    				for (int i = 0; i < n; i++) {
    					list1.add(a1 + i);
    				}
    				for (int i = 0; i < list.size(); i++) {
    					if (list1.get(0) < list.get(i).get(0)) {
    						list.add(new ArrayList()); //需要添加一个新的元素;
    						for (int j = list.size()-1; j > i; j--) {
    							list.set(j, list.get(j - 1));
    						}
    						list.set(i, list1);
    						break;
    
    					}
    				}
    				if(!list.contains(list1)) {
    					list.add(list1);
    				}
    			}
    
    		}
    		return list;
        }
    }
    
    多思考,多尝试。
  • 相关阅读:
    UML的相关基础知识
    easyui的datagrid、treegrid增加表头菜单,用于显示或隐藏列
    easyui datagrid load的时候,提交的时候多了name为数字的参数
    Easyui Dialog 设置初始位置
    投票系统的代码总结
    部门组织机构树的使用
    TCP连接客户端的方法
    播放M3U8的js代码
    JAVA的split的用法
    BOLB转word文件,和word文件转换BOLB
  • 原文地址:https://www.cnblogs.com/LynnMin/p/9334660.html
Copyright © 2020-2023  润新知