java combinationsum_combination-sum-ii(熟悉下Java排序)

packagecom.company;import java.util.*;classSolution {

Map>>mp;int[] nums;

Set> impl(int start, inttarget) {

String key= "" + start + "_" +target;if(mp.containsKey(key)) {returnmp.get(key);

}

Set>ret;if (start

ret= new HashSet<>();

ret.addAll(impl(start+1, target));

}else{

ret= new HashSet<>();

}if (start > 0) {if (target == nums[start - 1]) {

List item = new ArrayList<>();

item.add(nums[start- 1]);//print(item, 1);

ret.add(item);

}else if (start < nums.length && target > nums[start - 1]) {

Set> tmpRet = impl(start + 1, target - nums[start - 1]);

Iterator> iter =tmpRet.iterator();while(iter.hasNext()) {

List item = new ArrayList<>(iter.next());//print(item, 2);

item.add(nums[start - 1]);

Collections.sort(item);//print(item, 3);//System.out.println("Start " + start + " target " + target);

ret.add(item);

}

}

}/*System.out.println("Begin ret:" + key);

Iterator> iter = ret.iterator();

while (iter.hasNext()) {

print(iter.next(), 4);

}

System.out.println("End ret:" + key);*/mp.put(key, ret);returnret;

}public List> combinationSum2(int[] candidates, inttarget) {

nums=candidates;

mp= new HashMap<>();

List> ret = new ArrayList<>();if (candidates.length == 0) {returnret;

}

impl(0, target);

String key= "" + 0 + "_" +target;

ret= new ArrayList<>(mp.get(key));returnret;

}void print(List item, intflag) {

System.out.printf("Here %d:", flag);

Iterator iter=item.iterator();while(iter.hasNext()) {

System.out.printf("%d,", iter.next());

}

System.out.println();

}

}public classMain {public static voidmain(String[] args) {

System.out.println("Hello!");

Solution solution= newSolution();int[] cand = {10,1,2,7,6,1,5};int target = 8;

List> ret = solution.combinationSum2(cand, 8);

System.out.printf("Get ret: %s\n", ret.size());

Iterator> iterator =ret.iterator();while(iterator.hasNext()) {

Iterator iter=iterator.next().iterator();while(iter.hasNext()) {

System.out.printf("%d,", iter.next());

}

System.out.println();

}

System.out.println();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值