数据结构与算法面试题80道(32)
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法面试题80道(32)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
32.
有兩個序列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> 0,
??? 當x在(0,A)之間時,做這樣的交換才能使得交換后的a和b的和之差變小,
x越接近A/2效果越好,
?? 如果找不到在(0,A)之間的x,則當前的a和b就是答案。
?
#include<iostream> using namespace std; class RunClass{public:void BalanceArray(int array1[],int array2[],int n1,int n2);private:int sum(int array[],int n); };int RunClass::sum(int array[],int n){//計算數組和int sum=0;for(int i=0;i<n;i++){sum+=array[i];}return sum; }void RunClass::BalanceArray(int array1[],int array2[],int n1,int n2){if(n1!=n2) return;int *array=new int[n1];int sumValue=sum(array1,n1)-sum(array2,n2);if(sumValue<0){//比較兩個數組和的大小,讓array1>array2sumValue=-sumValue;array=array1;array1=array2;array2=array;}bool ifCycle=true;//控制循環while(ifCycle){ifCycle=false;for(int i=0;i<n1;i++)for(int j=0;j<n2;j++){int itemValue=array1[i]-array2[j];if(itemValue<sumValue&&itemValue>0){//如果存在交換后能使差變小的a,bifCycle=true;int temp=array1[i];//交換它們array1[i]=array2[j];array2[j]=temp;sumValue-=2*itemValue;//校準A,上面推的公式}}} }int main(){int array1[]={1,2,3,4,5,6,7,81,9,90};int array2[]={3,9,2,8,7,1,6,11,13,7};RunClass a;a.BalanceArray(array1,array2,10,10);for(int i=0;i<10;i++)cout<<array1[i]<<" ";cout<<endl;for(int i=0;i<10;i++)cout<<array2[i]<<" ";cout<<endl;return 0; }?
轉載于:https://www.cnblogs.com/wabi87547568/p/5275827.html
總結
以上是生活随笔為你收集整理的数据结构与算法面试题80道(32)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机站点击商务通无轨迹解决方法
- 下一篇: Javascript中Base64编码解