小编典典

对于这种问题,通常将使用动态编程。但是,本质上可以归结为保留一组可能的总和,然后将输入值一个接一个地添加,如以下代码所示,并且具有相同的渐近运行时间: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找出和最接近指定值_如何找到数组元素与特定值最接近的和?相关推荐

  1. python输入多个数字 找出只出现一个的数字_在python数组中找到接近给定数字的多个值...

    如果按照元素远离枢轴的顺序对数组进行排序,那么您将能够获取前k个元素,这些元素最接近您正在查看的元素 def k_closest(sample, pivot, k): return sorted(sa ...

  2. java 4位数,java 找出4位数的所有吸血鬼数字

    java 找出4位数的所有吸血鬼数字 /** * 找出四位数所有的吸血鬼数字 * 吸血鬼数字:位数为偶数的数字可以由一对数字相乘而得,这对数字包含乘积一半的位数 * 如:1260 = 21*60 */ ...

  3. java怎么找出数组最小值,Java找出数组的最小值元素

    Java找出数组的最小值元素 1 说明 在此程序中,我们需要找出数组中存在的最小元素.这可以通过保持变量min来实现,该变量起初将保留第一个元素的值.通过将min的值与数组的元素进行比较来遍历数组.如 ...

  4. 用CE来找出对对碰游戏 坐位号基址,棋盘数组基址 并把它读出来

    用CE来找出对对碰游戏 坐位号基址,棋盘数组基址 并把它读出来 1.预备知识    4种数据类型    字节 Byte=00-FF                           0-255   ...

  5. java 找出所有水仙花数,java兑现找出所有的水仙花数

    java实现找出所有的水仙花数. 水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身.(例如:1^3 + 5^3 + 3^3 = 153) 在没有考虑效率的情况下 ...

  6. Java 找出四位数的所有吸血鬼数字 基础代码实例

    /**  * 找出四位数的所有吸血鬼数字  * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序.  * 以两个 ...

  7. java找出两个字符串中所有共同的子串_【Java笔记】

    Leetcode 1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是, ...

  8. java 找出姓“张”的学生,将他们的信息写入第二个文件

    一.需求 编写一个Java源程序,其中包含: 编写一个包含主方法main的公共类(访问权限为public的类),主方法main中完成的任务是: (1)从键盘上输入两个文件的路径名及其文件名. (2)从 ...

  9. Java找出数组中第K大的数

    题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5 ...

最新文章

  1. python selenium 处理弹窗_python selenium 弹出框处理的实现
  2. 面向对象课程第二单元作业总结
  3. 3,ORM组件XCode(简介)
  4. Pandas简明教程:二、Pandas基本数据结构-DataFrame与Series
  5. 深度学习还不能解决什么问题?
  6. 成功解决ValueError: Could not interpret input day
  7. c++TCP的三次握手和四次挥手
  8. 字符函数和内存函数模拟实现
  9. Angular Component UI单元测试的隔离策略
  10. VSFTP的主动模式和被动模式
  11. 每天CookBook之JavaScript-059
  12. Qt文档阅读笔记-QtConcurrent Progress Dialog Example解析
  13. ContentPresenter
  14. python怎么去掉换行符_python去除字符串中的换行符
  15. 【转】你用什么手机,你就是什么人品!!
  16. FZU2105 Digits Count(按位建线段树)题解
  17. php中字符串与数组的相互转化explode(separator,$str)与implode(separator,$arr)
  18. python 写的第一个爬虫 下载网页视频,调用迅雷下载,男神喜欢
  19. 新题速看~2021阿里、腾讯、字节都在问的SQL数据库笔试题及答案都给你整理好啦
  20. Qt实现16进制unicode转utf-8以及国际音标编码问题

热门文章

  1. 牛客网笔试题 (经常更新)
  2. transform video to frames/提取视频中的每一帧
  3. 学习下载MySQL安装配置
  4. 七夕,你来人间一趟,总要谈一场轰轰烈烈的恋爱
  5. 【软件设计师】下午题总结
  6. 第八届中国云计算大会总结(第二天会议附带现场PPT及录音)
  7. FL Studio2023最新中文免费版水果音乐制作软件
  8. 神经网络通俗理解和理解,卷积神经网络通俗理解
  9. 跟着福禄克工程师一起学习POE知识
  10. 看生物学家如何恶搞PLOS ONE