当前位置: 首页 > news >正文

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();

    }
}

 

转载于:https://www.cnblogs.com/charlesblc/p/6001320.html

相关文章:

  • hping网络安全工具的安装及使用
  • Android开发学习——应用安装过程
  • class path resource [applicationContext.xml] cannot be opened because it does not exis
  • Arrar.prototype.map()的用法
  • [ERROR] Plugin 'InnoDB' init function returned error
  • oracle授权动态视图权限给用户
  • RAC 11.2的新特性
  • ABP文档 - Javascript Api
  • node学习第三天(2)
  • Ansible之玩转常见运维场景(个人总结)
  • 照虎画虎——简单WeUI模板UX设计学习
  • There is no Action mapped for namespace [/] and action name [TestAction] ass
  • php中定义数组的方法详解
  • 下一步要怎么玩?
  • 局域网、交换机原理、VLAN技术个人理解、Trunk技术
  • Cumulo 的 ClojureScript 模块已经成型
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • JavaScript对象详解
  • JS函数式编程 数组部分风格 ES6版
  • tensorflow学习笔记3——MNIST应用篇
  • yii2中session跨域名的问题
  • 成为一名优秀的Developer的书单
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 关于使用markdown的方法(引自CSDN教程)
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 收藏好这篇,别再只说“数据劫持”了
  • 硬币翻转问题,区间操作
  • 原生js练习题---第五课
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • nb
  • Android开发者必备:推荐一款助力开发的开源APP
  • Hibernate主键生成策略及选择
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #162 (Div. 2)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (vue)页面文件上传获取:action地址
  • (第一天)包装对象、作用域、创建对象
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (汇总)os模块以及shutil模块对文件的操作
  • (一)为什么要选择C++
  • (转)socket Aio demo
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET框架
  • .NET上SQLite的连接
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @Bean, @Component, @Configuration简析
  • [2010-8-30]
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [BJDCTF2020]The mystery of ip