和差值最小子陣列劃分

2021-06-05 11:36:21 字數 1427 閱讀 1496

有乙個數列,要採取怎樣的劃分方法把它分成

2個數列,使得

2個數列的各自之和的差最小。

比如乙個數列(

5,8,13,27,14

),通過分成(

5,13,14

)和(8,27

),這樣

2個數列各自的和再作差就等於

35-32=3

,這樣差值最小。

暫時有兩種想法可以做,現在只給出第一種的**(c#)

1.      動態規劃

(1)就是根據輸入陣列的長度(n),把這個問題看成乙個n歩動態規劃的問題。

(2)對於動態規劃,需要有狀態變數記錄當前的狀態(這裡有當前歩i,前面的選擇情況,當前的差值);

(3)對於每一步的選擇有兩種,比如第i歩時,選擇將第i個數放入陣列1或者陣列2。

最後的實現就是遞迴狀態變數得到。

2.      列舉所有可能的差值

(1)      對於有限的陣列,算出所有數分成兩組可能的絕對值是可能的。

(2)      通過遞迴的形式,將長度大於2的陣列,劃分為兩個較小的陣列,然後分別計算它們可能得到的差值。然後再定義,兩個子陣列差值合併的計算方法和陣列長度為2時的計算方法即可。

(3)      對於兩個子陣列差值合併的計算,把差值按照一定順序排列,建立每個差值和整個陣列分組的對應關係,所以不用記錄每個差值對應的分組。

最後的實現就是遞迴陣列得到。

struct choiceset

public static int minval = 0, choicefinal = 0;

static void main(string args)

choiceset cs0;

cs0.choice = 1;

cs0.value = 0;

cs0.position = 0;

stepone(originallist, cs0);

writeresult(originallist, choicefinal);

console.readkey();

}static void writeresult(listli, int choice)

,]", li[li.count-1-i], choice % 2 + 1);

choice=(choice-choice%2)/2;

}console.writeline("the difference is .",minval);

}static void stepone(listli, choiceset cs)

else if (cs.position < li.count - 1)

else

}else}}

}static int getnum(string s)

return sum * sign;

}

最小子陣列

給定乙個整數陣列,找到乙個具有最小和的子陣列。返回其最小和。注意事項 子陣列最少包含乙個數字 您在真實的面試中是否遇到過這個題?yes 哪家公司問你的這個題?airbnb linkedin amazon cryptic studios dropbox epic systems tinyco hedv...

44 最小子陣列

給定乙個整數陣列,找到乙個具有最小和的子陣列。返回其最小和。注意事項 子陣列最少包含乙個數字 您在真實的面試中是否遇到過這個題?yes 樣例給出陣列 1,1,2,1 返回 3 思路和最大子陣列一樣,使用貪心演算法,貪心選擇是採用從頂向下 以迭代的方法做出相繼選擇,每做一次貪心選擇就將所求問題簡化為乙...

44 最小子陣列

給定乙個整數陣列,找到乙個具有最小和的子陣列。返回其最小和。給出陣列 1,1,2,1 返回 3 子陣列最少包含乙個數字 思路 從第乙個數開始累加,但是如果到第n個數開始和為正數,那麼就沒必要繼續將後面的陣列元素繼續相加,因為無論第n 1個數為正還是為負,和前n個數的和想加以後都會讓總和變得更大。因此...