交換序列a,b 中的元素,使兩序列的和之差最小

2021-08-07 13:41:54 字數 1222 閱讀 1668

演算法實現

有兩個序列a,b,大小都為n,序列元素的值任意整數,無序;

要求:通過交換a,b 中的元素,使[序列a 元素的和]與[序列b 元素的和]之間的差最小。

var a=[100,99,98,1,2, 3];

var b=[1, 2, 3, 4,5,40];

題目來自july大神的 微軟公司等資料結構+演算法面試100題(第1-100題)全部出爐

在此寫下自己的實現

#include

#include

#include

#include

using

namespace

std;

int main()

for(i = 0;icin>>j;

v2.push_back(j);

s2 += j;

}//將s1設定為和為大的那個集合

if(s1//排序為了二分查詢

sort(v1.begin(),v1.end());

sort(v2.begin(),v2.end());

low = 0;

high = v2.size()-1;

count=0;

a = s1-s2; //a 中存放當前兩個集合的差值

while(min!=a)

}//若有恰好等於tmp值的,無需再找,直接得到更新兩個集合

if(min == 0)

//選擇最合適的那個元素對應的下標

if(low!=v2.size()-1&&low!=0)

if(abs(tmp - v2[low])>abs(tmp-v2[low-1])

&& abs(tmp - v2[low+1])>abs(tmp-v2[low-1]))

low = low-1;

}//更新min值,並記錄下標

if(v1[i]-v2[low]>0 && v1[i]-v2[low]if(min>abs(tmp - v2[low]))

}//以下為交換當前最合適的兩元素

if(mincontinue;}}

//列印結果

for(i = 0;icout

<" ";

}cout

<" ";

}cout

0; }

801 使序列遞增的最小交換次數

我們有兩個長度相等且不為空的整型陣列 a 和 b 我們可以交換 a i 和 b i 的元素。注意這兩個元素在各自的序列中應該處於相同的位置。在交換過一些元素之後,陣列 a 和 b 都應該是嚴格遞增的 陣列嚴格遞增的條件僅為a 0 a 1 a 2 a a.length 1 給定陣列 a 和 b 請返回...

LeetCode 使序列遞增的最小交換(動態規劃)

我們有兩個長度相等且不為空的整型陣列 a 和 b 我們可以交換 a i 和 b i 的元素。注意這兩個元素在各自的序列中應該處於相同的位置。在交換過一些元素之後,陣列 a 和 b 都應該是嚴格遞增的 陣列嚴格遞增的條件僅為a 0 a 1 a 2 a a.length 1 給定陣列 a 和 b 請返回...

801 使序列遞增的最小交換次數

我們有兩個長度相等且不為空的整型陣列 nums1 和 nums2 在一次操作中,我們可以交換 nums1 i 和 nums2 i 的元素。例如,如果 nums1 1,2,3,8 nums2 5,6,7,4 你可以交換 i 3 處的元素,得到 nums1 1,2,3,4 和 nums2 5,6,7,8...