日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法面试题80道(32)

發布時間:2025/3/8 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法面试题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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。