题目:
给定一串数字(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记录到最终的结果中。记得需要对sum和ArrayList进行剪枝操作。假设咱们此时找到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;
}
}
}
网友评论