1.貪心策略:
由於需要最小化公式,所以對於a中的數需要求其在
b中差值最小的。由此的具體方案,對a和
b進行排序,這在
a中的第
i個數分配b中第
i個數進行求差值。
2.貪心選擇性:
給a中最小的數分配乙個b中最小的數,然後在剩餘的陣列中重複配對,就能得到最小的絕對差值和
證明:
取i,j 是a中最小和i!=j的兩個下標,且i下面分情況討論:
1.a[i]2.a[i]3.a[i]4.b[i]5.b[i]綜上所述abs<=abs',可得如果不按照貪心策略進行配對的話,則絕對差值不是最小的,因此要按照貪心策略進行配對,每次分配乙個最小的。
3.優化子結構:
當按照貪心策略配對後得到優化解abs,如果同時去除a和b中最大的兩個數k和t,abs'=abs-|k-t|是去除k和t的優化解
證明:
假設abs'是不是去除a和b中最大的k和t 的優化解,當加上k和t 兩個樹
後,根據貪心策略,優化解abs''=abs』+|k-t|,於是abs''等於abs,而abs是優化解,出現矛盾,所以當按照貪心策略配對後得到優化解c,如果同時去除a和b中最大的兩個數k和t,abs'=abs-|k-t|是去除k和t的優化解
4.偽**:
function getmin_sum_abs
sort(a);//這裡可以用時間複雜度為nlogn的演算法,比如快排
sort(b);//同上
sum = 0
for i=0 to a.length
sum+=abs(a[i]-b[i]);
return sum;
5.演算法複雜度:o(nlogn)
交換兩個陣列使兩個陣列和的差最小
有兩個陣列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 ...
交換兩個陣列使兩個陣列和的差最小
有兩個陣列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 ...
計算兩個陣列的差集
給你兩個分別有 5000 個元素的陣列,計算他們的差集 方案1迴圈第乙個陣列 判斷item是否在第二個陣列裡,如果在,則unset掉這個鍵,最後剩下的陣列就是差集 function array diff array 1,array 2 return array 1 方案2 最優 效率最快 將第二個陣...