COMP9021-Lectures final question

题目:

给定一串数字(arrays)和一个指定的数(num),求出这串数字中和为指定的数(num)的子串集合。

举例:
arrays: 1, 2, 3, 4, 5, 6
num: 6
结果: [1, 2, 3], [1, 5], [2, 4], [6]


思路:

此题可以使用递归和回溯的思想解决。

  • 首先需要将给定的数组进行正序排序。Java提供了Arrays.sort()可以很方便的实现数组的正序排序。
  • 从给定的数字的第一个数字开始,将它计入到一个ArrayList中,同时设一个int类型的变量sum用来记录遍历过的数字的和(ArrayList中所有数字的和)。
  • 一旦和sum等于指定的数num就将此时的ArrayList记录到最终的结果中。记得需要对sumArrayList进行剪枝操作。假设咱们此时找到1,2,3满足条件此时需要减去3,看看后面的4和1,2相加是否满足条件。
  • sum < num的时候继续寻找下一个数重复同样的过程。使用递归进行查找。同样不要忘记剪枝。
  • sum > num的时候返回到递归的上一层。

代码:

/**
     * Find arrays whose sum is specified sum.
     * @param arrays
     * @param sum
     * @return
     */
    public ArrayListsolution(int [] arrays, int sum){
        ArrayListresults = new ArrayList();
        ArrayListresult = new ArrayList();
        Arrays.sort(arrays);
        recursive(arrays, sum, 0, 0, results, result);
        return results;
    }
    
    /**
     * Recursion to find sub-arrays meeting the requirement.
     * @param arrays
     * @param sum
     * @param nsum
     * @param k
     * @param results
     * @param result
     */
    private void recursive(int [] arrays, int sum, int nsum, int k, ArrayListresults, ArrayListresult){
        for(int i=k;i

你可能感兴趣的:(COMP9021-Lectures final question)