40. 组合总和 II

题目:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。
说明:与39题不同之处:数字使用次数与数组是否有重复元素 相同点是:相同数字列表的不同排列视为一个结果。
如何去掉重复的集合(重点)
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。

示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[[1, 7],[1, 2, 5],[2, 6],[1, 1, 6]]

代码: //在力扣39题的基础上修改2处地方即可
class Solution {
public List<List> combinationSum2(int[] candidates, int target) {
var list=new ArrayList<List>();
var arr=new ArrayList();
int sum=0;
Arrays.sort(candidates);
backTrack(list,arr,candidates,target,0);

return list;
}
public  static void backTrack(List<List<Integer>> alist,List<Integer> arr,int[] acandidates, int atarget,int t){
    if(atarget==0){
        var temp=new ArrayList<Integer>(arr);
        if(!alist.contains(temp)){    //修改处1,因为元素使用次数由多次转变成1次,所以在先排序基础上,重复元素选出来的是同一个数组列表,所以要先判断是否已存在。  
        alist.add(temp);}
    }
    if(atarget>0){
        for(int i=t;i<acandidates.length;i++){               
             if(acandidates[i]<=atarget){
                 arr.add(acandidates[i]);
                 backTrack(alist,arr,acandidates,atarget-acandidates[i],i+1);  //修改处2,由i变为i+1,因为不能重复选同一个,所以下标后移一位
                 arr.remove(arr.size()-1) ; }  //数字和小于目标数                          
        }
    }
}

}

posted @   堤苏白  阅读(73)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示