博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Combination Sum II Leetcode
阅读量:5294 次
发布时间:2019-06-14

本文共 2711 字,大约阅读时间需要 9 分钟。

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

Each number in C may only be used once in the combination.

Note:

  • All numbers (including target) will be positive integers.
  • The solution set must not contain duplicate combinations.

 

For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8

A solution set is: 

[  [1, 7],  [1, 2, 5],  [2, 6],  [1, 1, 6]]
 
 
这道题和combination sum非常像,只是需要注意,这个需要判断是不是重复的,因为input是可能有重复值的。可以用contains来判断是否有重复,但是很慢,比较妙的是添加的时候就判断了。
用contains判断
public class Solution {    List
> result; List
current; public List
> combinationSum2(int[] candidates, int target) { result = new ArrayList<>(); if (candidates == null || candidates.length == 0) { return result; } current = new ArrayList<>(); Arrays.sort(candidates); helper(candidates, target, 0); return result; } public void helper(int[] candidates, int target, int start) { if (target < 0) { return; } if (target == 0) { List
tmp = new ArrayList<>(current); if (!result.contains(tmp)) { result.add(new ArrayList<>(current)); } return; } for (int i = start; i < candidates.length && target >= candidates[i]; i++) { current.add(candidates[i]); helper(candidates, target - candidates[i], i + 1); current.remove(current.size() - 1); } }}

添加时判断

public class Solution {    List
> result; List
current; public List
> combinationSum2(int[] candidates, int target) { result = new ArrayList<>(); if (candidates == null || candidates.length == 0) { return result; } current = new ArrayList<>(); Arrays.sort(candidates); helper(candidates, target, 0); return result; } public void helper(int[] candidates, int target, int start) { if (target < 0) { return; } if (target == 0) { List
tmp = new ArrayList<>(current); result.add(new ArrayList<>(current)); return; } for (int i = start; i < candidates.length && target >= candidates[i]; i++) { if (i > start && candidates[i] == candidates[i - 1]) { continue; } current.add(candidates[i]); helper(candidates, target - candidates[i], i + 1); current.remove(current.size() - 1); } }}

需注意这种判断方式不适合可重复取同一个数字的情况(也就是不适合combination sum lintcode), 因为重复取的时候start一直在左边,所以重复的数字也会被加进去,会导致重复的结果。

转载于:https://www.cnblogs.com/aprilyang/p/6565347.html

你可能感兴趣的文章
code-代码平台服务器路径
查看>>
离线安装 Visual Studio Express 而不下载整个镜像文件的方法(转载)
查看>>
2014年国际数学家大会台历
查看>>
[数分提高]2014-2015-2第3教学周第1次课
查看>>
2017-2018-2偏微分方程复习题解析10
查看>>
Java抽象类和接口的比较
查看>>
web技术工具帖
查看>>
SpringBoot项目中常见的注解
查看>>
一次性搞明白 service和factory区别
查看>>
select下拉二级联动
查看>>
iOS UI控件5-UIPickerView
查看>>
深入Java虚拟机读书笔记第三章安全
查看>>
IO流 总结一
查看>>
素数筛选法
查看>>
php连接postgresql数据库
查看>>
Visual studio之C# 调用系统软键盘(外部"osk.exe")
查看>>
hdu 4506(数学,循环节+快速幂)
查看>>
Spring mvc 教程
查看>>
CentOS DesktopEntry
查看>>
基于python语言的自动化邮件发送总结
查看>>