java 给定Ñ和S,从1〜n的之间多个数之和为小号的序列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 给定Ñ和S,从1〜n的之间多个数之和为小号的序列相关的知识,希望对你有一定的参考价值。

public static List<List<Integer>> sumToK(int n,int k){
	    //从1~n中取数,使其加和等于k
	    if(n<1) return result;
	    ArrayList<Integer> comp = new ArrayList<Integer>();
	    sumtok(1,n,k,comp);
	    return result;
	}
	public static void sumtok(int cur,int n,int k,List<Integer> comp){
	    if(k==0 && cur<=n+1){
	    	ArrayList<Integer> r = new ArrayList<Integer>();
	    	for(Integer c : comp) r.add(c);
	        result.add(r);
	        return;
	    }  //这里的cur<n+1是因为有的边界值处于可行序列中而如果cur<n则导致该边界值加不进去
	    if(k<0 || cur>n) return;  //这里不能是cur>n+1,否则有可能碰到bug。
	    comp.add(cur);
	    sumtok(cur+1,n,k-cur,comp);
	    comp.remove(comp.size()-1);
	    sumtok(cur+1,n,k,comp);
	}
public static void sumToK(int n,int k){
	    //从1~n中取数,使其加和等于k
	    if(n<1) return;
	    ArrayList<Integer> comp = new ArrayList<Integer>();
	    sumtok(k,n,comp);
	}
	public static void sumtok(int sum,int n,List<Integer> comp){
	    if(n<=0 || sum<=0) return;
	    if(sum==n){
	        for(Integer c : comp) System.out.print(c+" ");
	        System.out.print(sum+" ");
	        System.out.println("\n");
	        return;
	    }
	    comp.add(n);
	    sumtok(sum-n,n-1,comp);
	    comp.remove(comp.size()-1);
	    sumtok(sum,n-1,comp);
	}
	//答案不对,缺少某些序列

以上是关于java 给定Ñ和S,从1〜n的之间多个数之和为小号的序列的主要内容,如果未能解决你的问题,请参考以下文章

209-长度最小的子数组

209. 长度最小的子数组

leetcode-209-长度最小的子数组

LeetCode#209-长度最小的子数组

209. 长度最小的子数组

LeetCode:长度最小的子数组209