微软面试100题系列---交换元素使2个序列的差值最小
来源:互联网 发布:微商城数据库设计 编辑:程序博客网 时间:2024/06/06 08:38
题目
有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
实现
思路:
当前数组a和数组b的和之差为
A = sum(a) - sum(b)
a的第i个元素和b的第j个元素交换后,a和b的和之差为
A’ = sum(a) - a[i] + b[j] - (sum(b) - b[j] + a[i])
= sum(a) - sum(b) - 2 (a[i] - b[j])
= A - 2 (a[i] - b[j])
设x = a[i] - b[j]
|A| - |A’| = |A| - |A-2x|
|A’|= |A-2x|
假设A > 0,
当x 在 (0,A)之间时,做这样的交换才能使得交换后的a和b的和之差变小,x越接近A/2效果越好,
如果找不到在(0,A)之间的x,则当前的a和b就是答案。
所以算法大概如下:
在a和b中寻找使得x在(0,A)之间并且最接近A/2的i和j,交换相应的i和j元素,重新计算A后,重复前面的步骤直至找不到(0,A)之间的x为止。
代码实现:
public static void BalanceArray(int[] array1,int[] array2){ if(array1.length!=array2.length){ return; } int sumA=sum(array1); int sumB=sum(array2); if(sumA==sumB){ return; } // if(sumA<sumB){ int[] array=array1; array1=array2; array2=array; } int n=array1.length; boolean ifCycle=true; int curDiff=1; int oldDiff=Integer.MAX_VLAUE; int pa=-1; int pb=-1; while(ifCycle){ ifCycle=false; curDiff=sum(array1)-sum(array2);//交换之前的差值 //寻找位于(0,A)之间的x=a[i]-a[j] /*寻找所有使交换后的差值变小的x中,使差值最小的x;交换,然后重新查找。为了重新查找,需要设置一个标志,代表是否还需要重新查找;如果找到x,则需要重新查找;*/ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ int itemValue=array1[i]-array2[j]; int newDiff=Math.abs(currDiff-2*itemValue);//交换之后的差值 if(newDiff<curDiff && newDiff<oldDiff){ ifCycle=true; pa=i; pb=j; } } } if(ifCycle){ //交换元素 int tmp=array1[i]; array1[i]=array2[j]; array2[j]=tmp; } } } private static int sum(int[] array) { int sum=0; for(int i=0;i<array.length;i++){ sum+=array[i]; } return sum; }
0 0
- 微软面试100题系列---交换元素使2个序列的差值最小
- 交换元素,使两数组之和的差最小 【微软面试100题 第三十二题】
- (微软面试100题)查找最小的K个元素
- 微软100题(32)交换两个数组元素,使得两个数组和差值最小
- 【从零单排之微软面试100题系列】05之查找最小的k个元素
- 微软算法100道题------通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小
- 查找最小的k个元素 【微软面试100题 第五题】
- 交换两序列a,b中的元素,使序列a的和与序列b的和之间的差值最小
- 交换两序列a,b中的元素,使序列a的和与序列b的和之间的差值最小
- 微软等数据结构+算法面试100题(46)-- 查找最小的k 个元素
- 交换两数组元素使两数组和差值最小
- 交换两个数组的元素使之总和的差值最小
- 交换两个数组的元素使之总和的差值最小
- 微软面试100题目之5 查找最小的k个元素
- 微软面试100道之 5 查找最小的k个元素(数组)
- 面试100题:5.查找最小的k个元素
- 面试100题:5.查找最小的k个元素
- 微软算法100道题-----查找最小的k个元素
- LeetCode Verify Preorder Serialization of a Binary Tree
- pod install安装第三方库异常
- @synchronized 的作用
- 使用ogg来进行业务系统割接的必查项目
- Java相关的整理
- 微软面试100题系列---交换元素使2个序列的差值最小
- 【蒻爆了的NOIP系列--普及组复赛】(4)NOIP2013普及组复赛题解
- 【蒻爆了的NOIP系列--普及组复赛】(5)NOIP2014普及组复赛题解
- 【蒻爆了的NOIP系列--普及组复赛】(6)NOIP2015普及组复赛题解
- 学习日记20160903
- SQLServer触发器
- Parcelable接口的使用
- 105. Construct Binary Tree from Preorder and Inorder Traversal
- C语言字符