当前位置: 首页 > 知识库问答 >
问题:

查找大小为k的子集,使值之间的最小距离最大

穆睿才
2023-03-14

假设我有一个包含n整数的数组。
如何找到大小k的子集,使得子集中所有整数对之间的最小距离最大化,我的意思是它们在最远的距离。

示例:数组a[]={1,2,6,7,10}k=3
子集={1,6,10},最小距离为10和6之间的4<错误的子集:
{1,7,10},最小距离为3
{1,2,6},最小距离为1

我想到了一个解决办法:

1) 排序数组2)选择一个[0],现在在数组中查找ceil(a[0]x)=Y。。。。然后ceil(Yx)等k-1次,第k个元素也将a[n-1]

要查找x
dp[i, j]是用于从第i个元素中选择j个元素的x
最后我们想要dp[n][k],它是x

但我在查找x时遇到了问题。

dp[i,j]=最大值(最小值(dp[k,j-1],dp[i]-A[k])
超过k=1到i-1,i=2到n,j=2到i

dp[i][1]=0 over i=1 to n

编辑:我想更正动态规划解决方案,尽管我知道可以通过对x进行二进制搜索来找到x。

更新2:我已经更新了代码,但仍然没有得到正确的解决方案。请指出错误
代码:http://ideone.com/J5vvR9

更新3:感谢@Gassa、@Niklas B.和@Fallen的回答!。


共有3个答案

云鸿达
2023-03-14

对X的值进行二进制搜索。然后为每个这样的X编写一个DP/贪婪函数,检查是否有一个数组的结果(元素之间的最大距离)大于或等于X。

正确性:如果对于任何一个X,我们可以有M个元素,使得它们之间的最小距离大于或等于X,那么对于每一个x,x

魏景龙
2023-03-14
匿名用户

我认为如果时间允许搜索x的可能值,则无需查找x。只需添加外部循环,这将是对答案的二分查找(即,最小距离,让我们称之为x)。

一旦x被修复,您就可以贪婪地从a[0]开始选取值。下一个选择的值将是这样的值:a[i],即i最小且a[i]-a[0]

总运行时间将为O(n log(C)),其中C是数组中可能值的总数。例如,如果数组中的整数从0到1000000,C将是1000001,log(C)(向上舍入)将是20。首先,您尝试x=500000;如果失败,则留给您答案的范围[0; 500000);如果不是,则使用范围[500000; 1000000]等。

龙高超
2023-03-14

底座应为:

dp[i][1] = INFINITY for i = 1 to n

原因是空集的最小值是正无穷大。

在实践中,对于某些ij,任何大于最大可能a[i]-a[j]的整数都足以作为INFINITY常量

此外,正确的过渡是:

dp[i,j] = max{for k=1 to i-1} (min(dp[k,j-1], a[i]-a[k]))
 类似资料:
  • 问题: 这是LeetCode的问题: 给定一个整数数组,返回所有对之间的 k 个最小距离。一对(A,B)的距离定义为A和B之间的绝对差。 例子: 我的问题 我用一个简单的方法解决了它O(n^2),基本上我找到所有的距离并对其进行排序,然后找到第k个最小的。现在这是一个更好的解决方案。这不是我的代码,我在leetcode的讨论论坛上找到了它。但是我很难理解代码的关键部分。 下面的代码基本上是在做一个

  • 我需要找到总和大于或等于< code>k的最小子阵列长度。数组将只有正数。 例如 输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]输出:2说明:子数组[4,3]在问题约束下长度最小。 在我的代码中,对于输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]我得到的答案是< code>3,但正确答案是< cod

  • 给定一个非负整数数组,设计最简单的算法来找到最大大小的子数组,并将其加到最小的值。 我的想法是,因为它们是非负整数,所以和最小的数组总是单个单元数组,只有原始数组的最小值。如果我理解正确的话,它取决于什么具有更高的优先级,具有更高的长度或更小的值。然而,这个问题从来没有明确说明哪一个优先。 我在这个问题上是正确的,还是我遗漏了什么?

  • 本文向大家介绍Powershell小技巧之找出最大最小值,包括了Powershell小技巧之找出最大最小值的使用技巧和注意事项,需要的朋友参考一下 要找出对象的最大最小值,请使用Measure-Object: 它支持多个数据并且还支持不通的数据类型,这里将它小小的修改就能返回WINDOWS目录下最近新创的文件: 只需要设置对象其中的一个属性就能够查看你想要的信息。 支持所有PS版本

  • 我想从数组的一部分找到最大值和最小值。我知道我可以通过复制数组将所需的数组部分复制到另一个数组中,但只是想知道是否可以不复制数组,因为我必须为不同的子数组进行循环 例如: 现在我想从1到4找到子数组的最小/最大值(如果可能,不复制子数组)

  • 给定一个数组arr,求最大abs(i-j),使abs(arr[i]-arr[j]) 经过深思熟虑,我想出了以下算法, 对于每个元素的排序,我们进行二进制搜索的复杂性是O(log n),,。总体时间复杂度为O(nlogn*2*logn),是渐近的O(nlogn)。 这种方法正确吗?是否有可能制定线性时间解决方案?我尝试使用哈希图,但发现很难得出线性解决方案。