数学问题 - 数组中找出n个数相加,最接近num的
有同事提过这个问题,现在有时间了实现下做个整理,主要当时排列组合的概念都不知道是啥了,更不用说实现功能了。
已经不知道排列组合,二项式定理,集合的可以先复习下相关概念和公式算法。
java实现排列组合 https://blog.csdn.net/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;//是否数组去重 --用于生成数组
// 比较值
int num = 14;
//获取数组--用于生成数组
int[] array = getRandomArray(amt, max, isDeduplication);
//找出数组中 几个数之和最靠近 num 的
List<String> result = arrayCalculation(array, num);
//结果打印
log.info("找出数组中几个数之和最靠近num的|数组{},比较值{}", array, num);
result.parallelStream().forEach(log::info);
}
/**
* 找出数组中 几个数之和最靠近 num 的
* <p>
* 1、剔除数组中大于num的
* 2、组合枚举记录 Map<Integer, List<String>>
* 3、map的key排序,获取最小
* 4、找出最小的n个记录获取返回
*
* @param array
* @param num
*/

418

被折叠的 条评论
为什么被折叠?



