最近一直看編程之美,想法真的很重要,今天發這篇文章還是有一點不自信,希望碰到志同道合的同學一起討論下!
本文來自:http://blog.csdn.net/lengzijian/article/details/7842551
題目:
有一個無序、元素個數爲2n的正整數數組,要求:如何能吧這個數組分割爲元素個數爲n的兩個數組,並使兩個子數組的和最近?
例如有如下數組如圖:
第一行:源數組
第二行:目的數組
書中講了很多方法,這裏就不在贅述了,我的方法也很簡單,相信很多人也想到了,但是沒有辦法證明這個方法的可靠性。今天我們主要講下,該方法的可靠性。
先來說下方法:
1. 首先對無序數組進行排序(時間複雜度nlogn)
2. 從當前源數組中取最大的元素,放置到一個和最小的目的數組中(起初都爲0,故可以隨意放置),同時這個最大元組從源數組中刪除。
3. 重複第2步,直到源數組個數爲0
按照如上方法:上題的到的結果爲:
左邊和爲43,右邊爲44。符合題意。
很多人第一感覺就是,①題目不會這麼簡單,②這種解法可能會有漏洞,下面對該種解法,做一下個人的理解。
1. 我把這種問題看作是往天平上放籌碼,放到最後的要求是天平兩端的差異最小;
2. 先把要放的籌碼都排好序;
3. 先放置最大籌碼到天平的任意一段(起初天平是平衡的);
4. 放置第二塊籌碼到天平籌碼重量輕的一段;
5. 放置第三塊籌碼到天平籌碼輕的一段(一定是和第二塊一起)。這時,有兩種可能:①:天平沒有動,此時應按照規則繼續放下一塊;②天平平衡有變化(包括兩邊平衡和逆變化),我們可以確定的是,此時此刻天平兩邊的籌碼重量差一定小於等於剛剛放上的籌碼(目前天平上最輕的籌碼)
6. 按照上面的方法,放到最後一塊後,如果天平平衡是有變化的,我們可以保證天平量變的差值永遠小於等於所有籌碼最小的一個。當沒有變化是,也可以保證我們的結果是正確的(自己考慮下)
目前我能想到的只有這些,根據上面的規則時間複雜度應該爲nlogn(排序)+n = O(nlogn)
如果本人哪裏說得不對,可以留言,也希望能夠遇到一些朋友一起討論下這方面的問題。