题目:

k数和 II

给定n个不同的正整数,整数k(1<= k <= n)以及一个目标数字。    

在这n个数里面找出K个数,使得这K个数的和等于目标数字,你需要找出所有满足要求的方案。

样例

给出[1,2,3,4],k=2, target=5,返回 [[1,4],[2,3]]

解题:

题目中限制的条件很多,A数组中的各个数字都不相等,A中k个数的和是 target  

问题:

1.在所有的组合方式中,A[i] 是否会重复,也就是说,A[i] ,即在{a,b,A[i]} 也在{a1,b1,A[i]}中。

可能:如A = {1,2,3,4,5} 3个数的和等于8的可能方式有:{1,2,5} 和{1,3,4}

思路:

根据深度优先变量的思想解决问题:

1.跳出点,target ==0  k ==0 时候,这条路径保存下来

k==0 但是target!=0时候说明路径中有k个数,但是target不满足条件,不保存。

2.递归过程:

对当前点加入到路径path中

从当前点的小一点开始 考虑:A中 k-1 个数的和target-A[i] 的情况

上面思想来源

Java程序:

public class Solution {
    /**
     * @param A: an integer array.
     * @param k: a positive integer (k <= length(A))
     * @param target: a integer
     * @return a list of lists of integer 
     */ 
    public ArrayList<ArrayList<Integer>> kSumII(int A[], int k, int target) {
        // write your code here
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> path = new ArrayList<Integer>();
        helper(result, path,A,k,target,0);
        return result;
    }
    public void helper(ArrayList<ArrayList<Integer>> result,ArrayList<Integer> path,int [] A,int k ,int remain,int index){
        if( path.size() == k){
            if(remain ==0 )
                result.add(new ArrayList<Integer>(path));
            else
                return;
        }
        
        for(int i = index;i< A.length ;i++){
            path.add(A[i]);
            helper(result,path,A,k,remain - A[i],i+1);
            path.remove(path.size() - 1);
        }
    }
}
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-16
  • 2021-07-14
  • 2021-06-09
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-09-11
  • 2022-02-02
  • 2021-11-10
  • 2022-12-23
  • 2022-12-23
  • 2022-02-20
相关资源
相似解决方案