java找出和最接近指定值_如何找到数组元素与特定值最接近的和?
小编典典
对于这种问题,通常将使用动态编程。但是,本质上可以归结为保留一组可能的总和,然后将输入值一个接一个地添加,如以下代码所示,并且具有相同的渐近运行时间:O(n
K),其中n输入数组的大小和K目标值。
但是,以下版本中的常量可能更大,但我认为代码比动态编程版本容易遵循。
public class Test {
public static void main(String[] args) {
int K = 44;
List inputs = Arrays.asList(19,23,41,5,40,36);
int opt = 0; // optimal solution so far
Set sums = new HashSet<>();
sums.add(opt);
// loop over all input values
for (Integer input : inputs) {
Set newSums = new HashSet<>();
// loop over all sums so far
for (Integer sum : sums) {
int newSum = sum + input;
// ignore too big sums
if (newSum <= K) {
newSums.add(newSum);
// update optimum
if (newSum > opt) {
opt = newSum;
}
}
}
sums.addAll(newSums);
}
System.out.println(opt);
}
}
编辑
关于运行时间的简短说明可能会很有用,因为我只是声称O(n K)没有理由。
显然,初始化和打印结果只需要花费恒定的时间,因此我们应该分析双重循环。
外循环遍历所有输入,因此它的主体执行n时间。
到目前为止,内部循环遍历所有总和,理论上它可能是指数值。 但是 ,我们使用的上限K,因此中的所有值sums都在范围内[0,
K]。由于sums是集合,因此最多包含K+1元素。
内循环内的所有计算都需要恒定的时间,因此总循环需要O(K)。出于相同的原因,该集合newSums最多也包含K+1元素,因此addAll最后也要使用O(K)。
总结:外循环执行n时间。循环体取O(K)。因此,该算法在中运行O(n K)。
编辑2
根据要求如何找到导致最佳总和的元素:
除了跟踪单个整数(子列表的总和)以外,还应该跟踪子列表本身。如果您创建一个新类型,则这相对简单(没有getter / setter来简化示例):
public class SubList {
public int size;
public List subList;
public SubList() {
this(0, new ArrayList<>());
}
public SubList(int size, List subList) {
this.size = size;
this.subList = subList;
}
}
初始化现在变为:
SubList opt = new SubList();
Set sums = new HashSet<>();
sums.add(opt);
sums需求的内部循环也需要一些小的调整:
for (Integer input : inputs) {
Set newSums = new HashSet<>();
// loop over all sums so far
for (SubList sum : sums) {
List newSubList = new ArrayList<>(sum.subList);
newSubList.add(input);
SubList newSum = new SubList(sum.size + input, newSubList);
// ignore too big sums
if (newSum.size <= K) {
newSums.add(newSum);
// update optimum
if (newSum.size > opt) {
opt = newSum;
}
}
}
sums.addAll(newSums);
}
2020-11-16
java找出和最接近指定值_如何找到数组元素与特定值最接近的和?相关推荐
- python输入多个数字 找出只出现一个的数字_在python数组中找到接近给定数字的多个值...
如果按照元素远离枢轴的顺序对数组进行排序,那么您将能够获取前k个元素,这些元素最接近您正在查看的元素 def k_closest(sample, pivot, k): return sorted(sa ...
- java 4位数,java 找出4位数的所有吸血鬼数字
java 找出4位数的所有吸血鬼数字 /** * 找出四位数所有的吸血鬼数字 * 吸血鬼数字:位数为偶数的数字可以由一对数字相乘而得,这对数字包含乘积一半的位数 * 如:1260 = 21*60 */ ...
- java怎么找出数组最小值,Java找出数组的最小值元素
Java找出数组的最小值元素 1 说明 在此程序中,我们需要找出数组中存在的最小元素.这可以通过保持变量min来实现,该变量起初将保留第一个元素的值.通过将min的值与数组的元素进行比较来遍历数组.如 ...
- 用CE来找出对对碰游戏 坐位号基址,棋盘数组基址 并把它读出来
用CE来找出对对碰游戏 坐位号基址,棋盘数组基址 并把它读出来 1.预备知识 4种数据类型 字节 Byte=00-FF 0-255 ...
- java 找出所有水仙花数,java兑现找出所有的水仙花数
java实现找出所有的水仙花数. 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3 + 3^3 = 153) 在没有考虑效率的情况下 ...
- Java 找出四位数的所有吸血鬼数字 基础代码实例
/** * 找出四位数的所有吸血鬼数字 * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序. * 以两个 ...
- java找出两个字符串中所有共同的子串_【Java笔记】
Leetcode 1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是, ...
- java 找出姓“张”的学生,将他们的信息写入第二个文件
一.需求 编写一个Java源程序,其中包含: 编写一个包含主方法main的公共类(访问权限为public的类),主方法main中完成的任务是: (1)从键盘上输入两个文件的路径名及其文件名. (2)从 ...
- Java找出数组中第K大的数
题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5 ...
最新文章
- python selenium 处理弹窗_python selenium 弹出框处理的实现
- 面向对象课程第二单元作业总结
- 3,ORM组件XCode(简介)
- Pandas简明教程:二、Pandas基本数据结构-DataFrame与Series
- 深度学习还不能解决什么问题?
- 成功解决ValueError: Could not interpret input day
- c++TCP的三次握手和四次挥手
- 字符函数和内存函数模拟实现
- Angular Component UI单元测试的隔离策略
- VSFTP的主动模式和被动模式
- 每天CookBook之JavaScript-059
- Qt文档阅读笔记-QtConcurrent Progress Dialog Example解析
- ContentPresenter
- python怎么去掉换行符_python去除字符串中的换行符
- 【转】你用什么手机,你就是什么人品!!
- FZU2105 Digits Count(按位建线段树)题解
- php中字符串与数组的相互转化explode(separator,$str)与implode(separator,$arr)
- python 写的第一个爬虫 下载网页视频,调用迅雷下载,男神喜欢
- 新题速看~2021阿里、腾讯、字节都在问的SQL数据库笔试题及答案都给你整理好啦
- Qt实现16进制unicode转utf-8以及国际音标编码问题