交换两个数组的元素,使两个数组和的差最小

本文介绍了如何在两个有序数组中通过交换元素使它们的和差最小。提出了一种时间复杂度为O(N+M)的贪心算法,通过比较每个元素与目标差值的一半来寻找最佳交换对。并提供了C语言实现的示例代码。
摘要由CSDN通过智能技术生成

前些时候面试碰到的题目:有两个有序正整数数组array1[N]、array2[M],通过交换两数组的元素,使两个数组的和最接近。

 基本算法思路:

每次从array1、array2选择出一对能使交换后得array1和与array2和的差值变小的组合array1[i]、array2[j]作交换;直到对任意组合array1[i]、array2[j]作交换,array1和与array2和的差值都无法变得更小,算法即结束。

 网上查了下,基本有两种算法:

(1)       暴力算法:采用双重循环取逐一比较组合array1[i]、array2[j],只要交换能让array1和与array2和的差值变小,即进行交换;直到算法结束。

 (2)       贪心算法:采用双重循环逐一比较取组合,找到交换后能让array1和与array2和的差值变得最小的组合array1[i]、array2[j],才进行交换;直到算法结束。

上面的贪心算法中为寻找最优组合,采用双重循环逐一比较,算法时间复杂度最好也只有O(N*M) ( 若N=M即(N^2) )。自己琢磨了一段时间,同样采用贪心算法,发现寻找最优组合的算法时间复杂度可以达O(N+M) ( 若N=M即(N) ),下面是相关分析:

 假设sum(array1) > sum(array2):

当前数组array1和数组aarray2的和之差为:

 A = sum(array1) - sum(array2)

 对组合array1[i]、array2[j],交换后,array1与array2的和之差为:

A' = sum(array1) - array1 [i] + array2 [j] - (sum(array2) - array2 [j] + array1 [i])
           = sum(array1) - sum(array2) - 2 (array1 [i] - array2 [j])
           = A - 2 (array1 [i] - array2 [j])

 设x = array1[i] - array2 [j]

最优组合即为使得x最接近A/2的一对array1[i]、array2[j]组合。

  我给出的寻找最优组合的算法思路:

首先,将i,j初始化为0,

若当前array1[i] - array2 [j]> A/2,即array2 [j]偏小;执行操作j++ 再进行比较;

若当前array1[i] - array2 [j]< A/2,即array2 [i]偏小;执行操作i++ 再进行比较;

直到i=N-1,j=M-1,算法时间复杂度为O(N+M)。

 

举例分析:

Array1[LENGTH2]={7, 15, 18, 23, 38,42}    sum(array1)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值