前些时候面试碰到的题目:有两个有序正整数数组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)