数学问题 - 数组中找出n个数相加,最接近num的
有同事提过这个问题,现在有时间了实现下做个整理,主要当时排列组合的概念都不知道是啥了,更不用说实现功能了。
已经不知道排列组合,二项式定理,集合的可以先复习下相关概念和公式算法。
java实现排列组合 https://blog.youkuaiyun.com/xinpz/article/details/109728624
目录
一、概述
问题:数组中找出n个数相加,最接近num的
实现思路:
1、核心算法是对数组做组合,然后记录枚举
2、对组合枚举记录加和,和比较值num做减法取绝对值。
3、用map<Integer,List<String>> 做结果集。key为组合枚举记录加和,和比较值num做减法取的绝对值。 value为组合枚举记录。由于接近的记录会有多个,所以用list。
4、对map的key排序取最小值,value就是想要的结果。
二、示例代码
package com.cnzz.mytest.test;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
* ************************************************************
* Copyright © 2020 cnzz Inc.All rights reserved. * **
* ************************************************************
*
* @program: demo
* @description:
* @author: cnzz
* @create: 2020-10-28 19:14
**/
@Slf4j
public class ArrayCalculation {
private static String SPLIT = "+";
private static String ES = "=";
//组合算法全局区间
static List<Integer> list = new ArrayList<>();
//组合枚举数记录
static int cnt = 0;
@Test
public void excute() {
int amt = 4;//数组数目 --用于生成数组
int max = 10;//数值边界 --用于生成数组
boolean isDeduplication = true;//是否数组去重 --用于生