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

给定一个整数数组,找到两个差最小且和为M的整数

韩寂离
2023-03-14

给定一个无序整数列表,以这种方式打印两个总计为m的整数int1 int2(int 1小于或等于int 2,它们之间用空格隔开)。假设整数列表中总是有m的解。int1和int2必须是正整数。

如果有多个解决方案,请打印差异最小的整数对。

例子:

Li = [2, 6, 8, 10, 4]
m = 10

Output: 
4 6

这是我的代码,但是根据我们的编译器(这是我们班的一个练习),我对隐藏的测试用例有错误的输出。

li = [2, 6, 8, 10, 4]
m = int(input())
selection = {}                  # I created a dictionary to put all pairs, sort them
                                # and print the pair with the least difference.

for j in li:

index = li.index(j)             
temp = li.pop(index)

    if m-j in li and j != m:          # checks if m-j is present in the list, and j
                                      # does not equal to m, since we're only looking
                                      # for positive integer pairs

        if abs(j - (m-j)) not in selection :            # don't have to rewrite in the dict
                                                             # if pair is already written.

            selection[abs(j - (m-j))] = [min(j, m-j), max(j, m-j)]

    li.insert(index, temp)

output = min(selection.keys()) # gets the pair  with the minimum difference in the dict

print(*selection[output])      

更新:代码工作!

共有1个答案

苏晓博
2023-03-14

代码:

Li = [2, 6, 8, 10, 4]
m = 10

#Output: 
#4 6

m_satisfied = []
for i in range(len(Li) - 1):
    for j in range(i+1, len(Li)):
        if (Li[i] + Li[j]) == m:
            m_satisfied.append(tuple([Li[i], Li[j]]))

diff_dict = {i: abs(t[0] - t[1]) for i,t in enumerate(m_satisfied)}
least_diff = min(diff_dict.values())
ind_m_satisfied = [k for k, v in diff_dict.items() if v == least_diff]
res_int = [m_satisfied[i] for i in ind_m_satisfied]
print(res_int)
print(res_int[0][0], res_int[0][1])

输出:

[(6, 4)]
6 4
 类似资料:
  • 我知道这是一个背包问题,其中权重和值相等,但我认为我在编码逻辑上犯了一个错误,因为即使对于数组中元素的数量(N)为50并且所需的最大总和(M)4500。 为了澄清这个问题,我们得到了一个由N个正整数和一个正整数M组成的数组。数组元素只能使用一次。我们必须找到这个数组的子集(不一定是连续的),使得总和最接近M,但不超过它。 这是我使用动态编程的尝试: 那么在我的代码中是否有任何可能的优化可以帮助我降

  • 问题内容: 我们需要在分配中递归地找到一个数组中的第二个最小整数。但是,为了更好地理解该主题,我想先通过本网站进行迭代,然后自己进行递归。 不幸的是,迭代地进行相当混乱。我知道该解决方案很简单,但我无法解决。 到目前为止,以下是我的代码: 这适用于一些数字,但不是全部。数字会变化,因为内部if条件的效率不如外部if条件的效率。 禁止阵列重排。 问题答案: 试试这个。当最小的数字是第一个时,第二个条

  • 我只能想到一个朴素的算法,它列出集合的所有子集,并检查子集的和是否和是否最小,但它是一个指数算法,列出所有子集需要O(2^n)。我能用动态规划在多项式时间内求解吗?

  • 我试着写一个代码,它接受一个介于1和1_000_000之间的整数,并返回一个比相同数字的整数大的最小整数,如果它不存在,则打印0。 举个例子 输入:156 输出165 输入330 输出0 输入27711 输出71127 我的问题是,下面的代码没有为其他输入返回正确的输出。 例如,在输入4231中,输出应该是4312。 我很难找到为每个输入返回正确输出的最佳算法。 TNX提前 }

  • 给定一个数组,你必须找到最大可能的两个相等的总和,你可以排除元素。 即给定数组,我们可以有最大两个相等的和,因为6 2=4 3 1 即 4,10,18, 22,我们可以得到两个相等的总和,因为 18 4 = 22 除了蛮力寻找所有计算并检查两个可能的相等和之外,你解决这个问题的方法是什么? 编辑1:数组元素的最大数目为N 编辑2:这是我的解决方案,https://ideone.com/cAbe4g

  • 问题内容: 想象两个正整数A和B。我想将这两个整数合并为一个整数C。 不能有其他整数D和E组合成C。因此,将它们与加法运算符组合起来是行不通的。例如,30 + 10 = 40 = 40 + 0 = 39 + 1叠加都不起作用。例如,“ 31” +“ 2” = 312 =“ 3” +“ 12” 此组合运算还应该是确定性的(始终在相同的输入下产生相同的结果),并且应始终在整数的正或负侧产生整数。 问题