給定一個奇數大小的數組。您必須從數組中刪除任何一個元素,然後查找是否可以將剩餘的偶數大小數組分成兩組大小相等的元素並且具有相同的元素總和。從數組中刪除任何一個元素是強制性的。從數組中刪除任何一個元素後,將奇數大小的數組分成兩組相等大小和相同的總和
-2
A
回答
0
所以在這裏,我假設有必要從數組中刪除1個元素。
請看下面的代碼片段。
int solve(int idx, int s, int cntr, int val) {
if(idx == n)
if(cntr != 1)
return INT_MAX;
else
return abs((sum-val)-2*s);
int ans = INT_MAX;
if(cntr == 0)
ans = min(ans, solve(idx+1, s, cntr+1, arr[idx]));
else
ans = min(ans, min(solve(idx+1,s+arr[idx], cntr, val), solve(idx+1, s, cntr, val)));
return ans;
}
這裏sum
是原始數組的總和, val
是其中U要刪除的位置的元素的 值,並且cntr
跟蹤任何值是否被從陣列或不除去。
所以算法就是這樣。
忘記你需要刪除任何值,然後問題變成是否可以將數組分成2等份和半。現在我們可以想到這個問題,比如將數組分成2個部分,使得abs(sum-2*sum_of_any_half_part)
最小化。所以有了這個想法讓我們說我最初有一個桶s
它可以是我們所關心的陣列的一部分。因此,在每一步我們都可以將任何元素放入此部分或將其留給其他部分。
現在,如果我們在這個問題中引入刪除部分,它只需要一個小的改變。現在在每個步驟而不是2個,你有3個選項。
- 要刪除該特定的元素,然後增加至
cntr
1和val
到元素的值的數組中的索引處。 - 不要對此元素做任何事情。這等於將該元素放入其他桶/一半
- 將該元素放入桶
s
中,即將s的值增加arr[idx]
;
現在遞歸地檢查哪個給出了最好的結果。
P.S.查看代碼片段中的基本案例以獲得更好的想法。
最後如果上面的solve
函數給出了ans = 0,那麼這意味着是我們可以在刪除任何元素之後將數組劃分爲2個等份部分。
希望這會有所幫助。
相關問題
- 1. 用相同的元素將數組分成小數組
- 2. 最大化一個數組的總和,同時保持其他數組的相應元素的和小於k
- 3. 將一個數組劃分爲兩個相等大小的子集,它們的總和差值最小
- 4. 總和不同大小的數組的
- 5. 如何刪除數組中的元素並縮小其大小?
- 6. 編寫一個獲取兩個int數組的方法,這兩個int數組的大小相同,並返回一個數組,該數組的總和爲
- 7. 將大小相等的數組合併到平鋪大數組中
- 8. 按升序合併兩個數組(兩個數組的大小相同)
- 9. 將n個數字分成兩組,每組的總和小於等於k
- 10. 如何從數組中刪除相同元素的元素
- 11. 如何從兩個相同大小的數組中構建一個Ruby哈希?
- 12. 解除分配後的數組大小
- 13. 二維數組中非相鄰元素的最大總和
- 14. 集成一個返回相同大小的數組而不是在Python中的元組的數組?
- 15. C++最大/在一個數組分鐘元素不知道數組的大小
- 16. 如何將一個大數組切片成較小的數組
- 17. 從數組生成在大小兩個postgres的唯一組合
- 18. 使用HashMap查找兩個相等大小的數組中的相似元素的計數
- 19. 如何獲得數組中偶數元素的奇數和相乘的總和
- 20. n變換後數組中最大的相同元素數
- 21. 包含相同元素的兩個數組不能相等嗎?
- 22. 我可以使用每兩個相同大小的數組
- 23. 比較兩個相同大小的diff數組
- 24. C++將int數組賦給一個int數組,其大小相同
- 25. 將數字集合分成兩組,總數相等
- 26. 將數組分成兩部分。預定的大小,可能並不總是相等的
- 27. 給定兩個相同大小的數組,找到兩個數組中的幾個元素,它們與最小的絕對值進行求和
- 28. Vb.net總結相同的數組元素
- 29. 刪除數組中的元素並調整其大小
- 30. 數組求和元素的相同值?
在給定的問題中是否需要刪除任何一個元素。我的意思是,如果我可以在不刪除任何元素的情況下將數組分成2個等分半部分。我應該認爲這是一個解決方案。 – Roshan
也請給出完整的問題約束,如數組的大小和數組中任何元素的最大值。 – Roshan
@Roshan這個問題來自Techgig網站,數組的大小高達100000.這就是爲什麼通過子集和問題來解決它似乎是昂貴的,因爲它具有O(n * sum)時間複雜度。 –