美文网首页
COMP9021-Lectures final question

COMP9021-Lectures final question

作者: BlueSkyBlue | 来源:发表于2018-05-29 21:53 被阅读34次

    题目:

    给定一串数字(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 ArrayList<String>solution(int [] arrays, int sum){
            ArrayList<String>results = new ArrayList<String>();
            ArrayList<Integer>result = new ArrayList<Integer>();
            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, ArrayList<String>results, ArrayList<Integer>result){
            for(int i=k;i<arrays.length;i++){
                nsum += arrays[i];
                if(nsum == sum){
                    result.add(arrays[i]);
                    String str = String.valueOf(result);
                    results.add(str);
                    nsum -= arrays[i];
                    result.remove(result.size() - 1);
                    return;
                }else if(nsum < sum){
                    result.add(arrays[i]);
                    recursive(arrays, sum, nsum, i+1, results, result);
                    nsum -= arrays[i];
                    result.remove(result.size() - 1);
                }else{
                    return;
                }
            }
        }
    

    相关文章

      网友评论

          本文标题:COMP9021-Lectures final question

          本文链接:https://www.haomeiwen.com/subject/ovhzjftx.html