当前位置: 首页 > 后端技术 > Java

LeetCode-040-CombinedSumII

时间:2023-04-01 21:46:43 Java

CombinedSumII题目描述:给定一个候选数组和一个目标数target,找出候选数中所有可以使数字之和为target的组合。candidates中的每个数字在每个组合中只能使用一次。解释:所有数字(包括目标数字)都是正整数。解决方案集不能包含重复的组合。例子见LeetCode官网。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode所有。商业转载请联系官方授权,非商业转载请注明出处。方案一:回溯算法首先对原数组进行排序;然后,声明一个数组freq,记录每个不同数字出现的次数;然后,利用回溯算法递归判断处理后的序列是否满足条件,将符合条件的序列加入到结果集中,最后返回所有符合条件的结果集。importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;publicclassLeetCode_040{/***记录每个不同数字出现的次数*/privatestaticListfreq=新数组列表<>();/***符合条件的结果集*/privatestaticList>ans=newArrayList<>();/***匹配序列*/privatestaticListsequence=newArrayList<>();/***回溯算法**@paramcandidates*@paramtarget*@return*/publicstaticList>combinationSum2(int[]candidates,inttarget){//首先对给定的数组进行排序Arrays.sort(候选人);for(intnum:candidates){intsize=freq.size();如果(freq.isEmpty()||num!=freq.get(size-1)[0]){freq.添加(新的int[]{num,1});}else{++频率。得到(大小-1)[1];}}dfs(0,目标);返回答案;}publicstaticvoiddfs(intpos,intrest){if(rest==0){/***如果当前和已经等于目标,则将当前序列添加到结果集中*/ans.add(newArrayList(sequence));返回;}if(pos==freq.size()||restintegers:combinationSum2(candidates,8)){for(Integerinteger:integers){System.out.print(integer+"");}System.out.println();}}}【每日留言】登高望远,不是要看遍全世界,而是要看遍整个世界