combination-sum-ii(熟悉下Java排序)
代码还是这一块代码,但是还是写的很慢。。
其中用到了Java对 List的排序。查了很久,发现使用 Collections.sort 很方便。
另外对结果的去重,使用了 Java的HashSet.
https://leetcode.com/problems/combination-sum-ii/
package com.company; import java.util.*; class Solution { Map<String, Set<List<Integer>>> mp; int[] nums; Set<List<Integer>> impl(int start, int target) { String key = "" + start + "_" + target; if (mp.containsKey(key)) { return mp.get(key); } Set<List<Integer>> ret; if (start < nums.length) { ret = new HashSet<>(); ret.addAll(impl(start+1, target)); } else { ret = new HashSet<>(); } if (start > 0) { if (target == nums[start - 1]) { List<Integer> item = new ArrayList<>(); item.add(nums[start - 1]); //print(item, 1); ret.add(item); } else if (start < nums.length && target > nums[start - 1]) { Set<List<Integer>> tmpRet = impl(start + 1, target - nums[start - 1]); Iterator<List<Integer>> iter = tmpRet.iterator(); while (iter.hasNext()) { List<Integer> 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<List<Integer>> iter = ret.iterator(); while (iter.hasNext()) { print(iter.next(), 4); } System.out.println("End ret:" + key);*/ mp.put(key, ret); return ret; } public List<List<Integer>> combinationSum2(int[] candidates, int target) { nums = candidates; mp = new HashMap<>(); List<List<Integer>> ret = new ArrayList<>(); if (candidates.length == 0) { return ret; } impl(0, target); String key = "" + 0 + "_" + target; ret = new ArrayList<>(mp.get(key)); return ret; } void print(List<Integer> item, int flag) { System.out.printf("Here %d:", flag); Iterator iter = item.iterator(); while (iter.hasNext()) { System.out.printf("%d,", iter.next()); } System.out.println(); } } public class Main { public static void main(String[] args) { System.out.println("Hello!"); Solution solution = new Solution(); int[] cand = {10,1,2,7,6,1,5}; int target = 8; List<List<Integer>> ret = solution.combinationSum2(cand, 8); System.out.printf("Get ret: %s\n", ret.size()); Iterator<List<Integer>> 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(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!