【问题标题】:Getting minimum possible number after performing operations on array elements对数组元素执行操作后获得最小可能数
【发布时间】:2020-06-24 05:40:20
【问题描述】:

问题:给定一个表示编号的整数(n)。最初的粒子
给定这些粒子的大小数组
这些粒子可以进入任意数量的模拟(可能没有)
在一个模拟中,两个粒子结合起来产生另一个粒子,其大小为它们之间的大小之差(可能为 0)。
找到可以形成的最小粒子。

constraints         
n<=1000        
size<=1e9   

Example 1    
3       
30 10 8            
Output           
2         
Explaination- 10 - 8 is the smallest we can achive

Example 2         
4        
1 2 4 8           
output            
1           
explanation            
We cannot make another 1 so as to get 0 so smallest without any simulation is 1

example 3         
5         
30 27 26 10 6         
output
0          
30-26=4            
10-6 =4          
4-4 =0    

我的想法:我只能想到显然会超时的蛮力解决方案。任何人都可以通过这种方法来帮助我吗?我认为这与动态规划有关

【问题讨论】:

  • 时间限制是多少?
  • @Happypig375 O(N^2) 将是最优的
  • @Saqlain 考虑使用优先队列。
  • @vivek_23 我考虑过优先级队列并每次都在 2 个最大的元素上应用该操作,但在某些情况下(例如我给出的示例 3)会失败)
  • @vivek_23 我在这里找到了它:leetcode.com/discuss/interview-question/334981/…

标签: algorithm math dynamic-programming


【解决方案1】:

我认为这可以在O(n^2log(n))解决

考虑您的第三个示例:30 27 26 10 6

对输入进行排序以使其成为:6 10 26 27 30

为每个(i,j) 组合建立一个差异列表。

为:

i = 1 -&gt; 4 20 21 24

i = 2 -&gt; 16, 17, 20

i = 3 -&gt; 1, 4

i = 4 -&gt; 3

i = 5 没有列表,为什么?因为它之前已经考虑过与其他粒子组合。

现在考虑以下情况:

案例 1

粒子i 尚未与任何其他粒子结合。这意味着其他一些粒子应该与i 以外的粒子组合。 这表明我们需要在j = 1 to N 列表中搜索A[i]j = i 除外。 获取最接近的值。这可以使用二分搜索来完成。因为您的差异列表已排序!那么你现在的结果是|A[i] - NearestValueFound|

案例 2

粒子i 与其他粒子组合。 以上面的i = 1 为例,让我们考虑它与粒子2 的结合。结果是4。 因此,在除列表2 之外的所有列表中搜索4 - 因为我们认为粒子2 已经与粒子1 结合,我们不应该搜索列表2。 我们有最好的比赛吗?似乎我们在列表 3 中找到了匹配的 4。它不必是0 - 在这种情况下它是0,所以只需返回0

对所有粒子重复案例 1、2。时间复杂度为O(n^2log(n)),因为您正在对除列表i 之外的每个i 的所有列表进行二分搜索。

【讨论】:

    【解决方案2】:
    import itertools as it
    
    N = int(input())
    
    nums = list()
    
    for i in range(N):
        nums.append(int(input()))
    
    _min = min(nums)
    
    def go(li):
        global _min
        if len(li)>1:
            for i in it.combinations(li, 2):
                temp = abs(i[0] - i[1])
                if _min > temp:
                    _min = temp
                k = li.copy()
                k.remove(i[0])
                k.remove(i[1])
                k.append(temp)
                go(k)
    
    go(nums)
    
    print(_min)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2010-12-15
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      相关资源
      最近更新 更多