求和算法

给定一个数组,一个目标值,算出所有和等于目标值的组合,组合中会出现重复值,且每个重复值只能在每个组合出现一次。

包含小数。

java;gutter:true; import java.util.*;</p> <p>public class Match {</p> <pre><code>public static void main(String[] args) { Double[] nums = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 5.5, 0.5, 0.5, 0.4}; List nlist = Arrays.asList(nums); Double target = 8.0; List> result = sum(nlist, target, null); for (List doubles : result) { System.out.println(Arrays.toString(new List[]{doubles})); } } public static List> sum(List nums, Double target, List> currentMatch) { int len = nums.size(); if (Objects.isNull(currentMatch)) currentMatch = new ArrayList<>(); for (int i = 0; i < len; i++) { if (target < nums.get(i)) continue; for (int j = i + 1; j < nums.size(); j++) { if (target < nums.get(j)) continue; if (nums.get(i) + nums.get(j) == target) { currentMatch.add(List.of(new Double[]{nums.get(i), nums.get(j)})); } else if ((nums.get(i) + nums.get(j)) < target) { List p1 = new ArrayList<>(); p1.add(nums.get(i)); p1.add(nums.get(j)); List tempNums = new ArrayList<>(nums); getMatch(p1, tempNums, j + 1, target, currentMatch, null); } } } return currentMatch; } public static void getMatch(List p1, List nums, int i, Double target, List> currentMatch, List exclude) { if (Objects.isNull(exclude)) exclude = new ArrayList<>(); int len = nums.size(); for (; i < len; i++) { int finalI = i; if (exclude.stream().anyMatch((e)-> e == finalI))continue; if ((getSum(p1) + nums.get(i)) == target) { p1.add(nums.get(i)); currentMatch.add(p1); exclude.clear(); } else if ((getSum(p1) + nums.get(i)) < target) { p1.add(nums.get(i)); exclude.add(i); getMatch(p1, nums, i + 1, target, currentMatch, exclude); } } } static Double getSum(List r) { if (r.isEmpty()) { return 0.0; } else { return r.stream().mapToDouble(Double::doubleValue).sum(); } } </code></pre> <p>}

大概思路是,O(n^2) 循环内先看前后两数的和是否为目标值,如果这两个数相加小于目标值,那么进入递归算出组合。

将已选出的组合数字在递归循环中排除。

if (exclude.stream().anyMatch((e)-> e == finalI))continue;

可以确保值只被使用一次。

优化空间还是有的,只不过我懒得看了。

Original: https://www.cnblogs.com/yangchaojie/p/16284718.html
Author: 杨超杰
Title: 求和算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/593201/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring(三)——AOP

    (1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。(2)通俗描述:不通过…

    Java 2023年6月16日
    065
  • Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash……系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历…

    Java 2023年5月29日
    077
  • 监控JAVA应用的好工具javamelody

    今天在JAVAEYE首页看到这个工具的推荐,看了下,不错:JavaMelody能够在QA和实际运行生产环境监测Java或Java EE应用程序服务器。并以图表的形式显示:Java内…

    Java 2023年5月29日
    081
  • 琐碎的想法(一)代码“优雅”的含义

    优雅的含义 代码优雅曾是翻译而来的,优雅这一个词语源于单词elegant。 elegant有三种含义,优美的(形容举止),精美的(形容物品),简明的。 形容代码上,应该包含了后两种…

    Java 2023年6月8日
    081
  • JavaWeb序

    服务器端的编程基础 因JS的特效在本机不能显示,故直接进行javaweb的学习,抱歉… BS与CS的异同 BS:客户端服务器架构模式 CS:浏览器服务器架构模式 Tom…

    Java 2023年6月5日
    0103
  • 深入详解Mybatis的架构原理与6大核心流程

    MyBatis 是 Java 生态中非常著名的一款 ORM 框架,目前在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架。 如果你想要进入一线大厂,能够熟练使用 My…

    Java 2023年6月15日
    087
  • 构造器

    package com.gao.test.Test2; public class Person { public Person(){ //构造器:没有任何参数的构造器 //叫做空参…

    Java 2023年6月5日
    077
  • JAVA利用enum结合testng做数据驱动示例

    数据驱动是做自动化测试中很重要的一部分,数据源的方案也是百花八门了,比如利用外部文件,直接在@DataProvider中写死等等,我们今天介绍一下利用enum来做数据源,先来看一下…

    Java 2023年5月29日
    070
  • JVM虚拟机性能监控与故障处理工具(3)

    1.概述 经过前面两章对于虚拟机内存分配与回收技术各方面的介绍,相信读者已经建立了 一个比较完整的理论基础。理论总是作为指导实践的工具,能把这些知识投入到实际工 作中才是我们的最终…

    Java 2023年6月13日
    072
  • 小程序接口申请和隐私文档

    谨以此文,记录我被微信开发工具折磨的这段日子 本指引是HexPal小程序开发者 (以下简称”开发者”)为处理你的个人信息而制定。 开发者处理的信息 根据法律…

    Java 2023年6月7日
    078
  • 01第一章:【1】_MQTT简介

    一、前言 物联网是新一代信息技术的重要组成部分,也是”信息化”时代的重要发展阶段。其英文名称是:”Internet of things(IoT)…

    Java 2023年5月29日
    074
  • HashMap 源码分析

    每当你想要努力一把的时候,都是未来的你在求救!!! 1. 概述 HashMap 是我们开发中很常用的一个 键值对集合。底层基于散列算法实现, HashMap 允许 Null 值和 …

    Java 2023年6月5日
    064
  • 序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询

    查询窗口中可以设置很多查询条件 表单中输入的内容转为datagrid的load方法所需的查询条件向原请求地址再次提出新的查询,将结果显示在datagrid中 转换方法看代码注释 &…

    Java 2023年5月30日
    0123
  • 第十六届全国大学生智能汽车竞赛电磁越野组参赛技术总结

    第十六届全国大学生智能汽车竞赛电磁越野组参赛技术总结 写在前面 前期准备 * 熟悉开发库 机械结构 技术报告 中期搭建 * 滤波归一 – 中值滤波 均值滤波 归一化 传…

    Java 2023年6月9日
    0106
  • 【转】Java的三种代理模式

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强…

    Java 2023年5月29日
    085
  • SpringCloud 上

    Spring Cloud 是在 Spring Boot 基础上构建的, 用于检查分布式系统构建的工具集. 工具集包括 配置管理, 服务发现, 智能路由,断路器,为代理和控制总线. …

    Java 2023年5月30日
    060
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球