教育类网站模板,最新软件开发国家标准,企业类展厅设计公司,陵水网站建设使用深度搜索的方法#xff1a; 由于题目说候选数组中的每个数字在每个组合只能出现一次#xff0c;所以#xff0c;为了避免重复#xff0c;在开始之前对候选数组进行升序排序#xff0c;这样优先选择小的数#xff0c;如果当前的数都小于目标值#xff0c;则后面的数就… 使用深度搜索的方法 由于题目说候选数组中的每个数字在每个组合只能出现一次所以为了避免重复在开始之前对候选数组进行升序排序这样优先选择小的数如果当前的数都小于目标值则后面的数就不用递归了。 具体步骤 1、定义一个列表freq每一个元素都是一个数组其中第一个元素代表候选数字第二个元素代表数字在候选数组中出现的次数。 2、定义深度优先搜索方法pos代表当前处理位置rest代表剩余目标数。 当目标数为0则说明已经找到了满足条件的组合就把暂存元素的列表sequence加入ans中如果pos超过了freq范围或者rest小于当前元素则返回说明不符合如以上两种都不满足就进入一个搜索循环这里要计算most变量代表最多可以计算几次当前数值rest / freq.get(pos)[0]这部分计算表示在当前剩余的目标值 rest 中最多可以添加多少个当前数字 freq.get(pos)[1]这部分计算表示当前数字在候选数组中的出现次数将这两个数字较小的返回这样才能添加不会超过目标值的数量。
class Solution {Listint[] freq new ArrayListint[]();//第一个元素表示候选数字第二个元素表示该数字在候选数组中的出现次数。ListListInteger ans new ArrayListListInteger();ListInteger sequence new ArrayListInteger();public ListListInteger combinationSum2(int[] candidates, int target){Arrays.sort(candidates);for(int num:candidates){int size freq.size();if(freq.isEmpty()||num!freq.get(size-1)[0]){freq.add(new int[]{num,1});}else{freq.get(size-1)[1];}}dfs(0,target);return ans;}public void dfs(int pos,int rest){//当目标数为0,说明全部找到了if(rest0){ans.add(new ArrayListInteger(sequence));return;}//如果pos超出当前freq范围或者rest小于当前数值则返回不再继续if(posfreq.size()||rest freq.get(pos)[0]){return;}dfs(pos1,rest);int mostMath.min(rest/freq.get(pos)[0],freq.get(pos)[1]);for(int i1;imost;i){sequence.add(freq.get(pos)[0]);dfs(pos1,rest-i*freq.get(pos)[0]);}for(int i1;imost;i){sequence.remove(sequence.size()-1); }}
}