簡體   English   中英

總和可被 k 整除的子序列的數量

[英]number of subsequences whose sum is divisible by k

我剛剛為一家公司做了一個編碼挑戰,但無法解決這個問題。 問題陳述如下:

給定一個整數數組,找出數組中總和可被 k 整除的子序列的數量,其中 k 是某個正整數。

例如,對於[4, 1, 3, 2]k = 3 ,解為 5。 [[3], [1, 2], [4,3,2], [4,2], [1,3,2]]是其總和可被k整除的子序列,即current_sum + nums[i] % k == 0 ,其中nums[i]是數組中的當前元素。

我試圖遞歸地解決這個問題,但是,我無法通過任何測試用例。 我的遞歸代碼如下:

def kSum(nums, k):
    def kSum(cur_sum, i):
        if i == len(nums): return 0
        sol = 1 if (cur_sum + nums[i]) % k == 0 else 0
        return sol + kSum(cur_sum, i+1) + kSum(cur_sum + nums[i], i+1)
    return kSum(0, 0)

這種遞歸方法有什么問題,我該如何糾正? 我對迭代解決方案不感興趣,我只想知道為什么這個遞歸解決方案是錯誤的以及我如何糾正它。

你確定這不是案例測試嗎? 例如:

[4, 1, 3, 2], k = 3

4+2 = 6, 1+2=3, 3, 1+2+3=6, 4+2+3 = 9

所以,你的函數是正確的(它給了我 5),我認為你的函數沒有重大問題。

這是您使用一些控制台日志編寫的內容的 javascript 復制,以幫助解釋其行為。

 function kSum(nums, k) { let recursive_depth = 1; function _kSum(cur_sum, i) { recursive_depth++; if (i == nums.length) { recursive_depth--; return 0; } let sol = 0; if (((cur_sum + nums[i]) % k) === 0) { sol = 1; console.log(`Found valid sequence ending with ${nums[i]} with sum = ${cur_sum + nums[i]} with partial sum ${cur_sum} at depth ${recursive_depth}`); } const _kSum1 = _kSum(cur_sum, i+1); const _kSum2 = _kSum(cur_sum + nums[i], i+1); const res = sol + _kSum1 + _kSum2; recursive_depth--; return res; } return _kSum(0, 0); } let arr = [4, 1, 3, 2], k = 3; console.log(kSum(arr, k));

我認為這段代碼實際上得到了正確的答案。 我不精通 Python,但我可能無意中修復了代碼中的錯誤,盡管在(cur_sum + nums[i]) % k周圍添加了括號

在我看來,您的解決方案是正確的。 它通過嘗試所有復雜度為2^n序列得出答案。 我們可以在O(n*k)搜索空間中遞歸地制定它,盡管它可能更有效。 f(A, k, i, r)表示當它們的總和除以k ,有多少子序列離開余數r ,使用最多為A[i]元素。 然后:

 function f(A, k, i=A.length-1, r=0){ // A[i] leaves remainder r // when divided by k const c = A[i] % k == r ? 1 : 0; if (i == 0) return c; return c + // All previous subsequences // who's sum leaves remainder r // when divided by k f(A, k, i - 1, r) + // All previous subsequences who's // sum when combined with A[i] // leaves remainder r when // divided by k f(A, k, i - 1, (k + r - A[i]%k) % k); } console.log(f([1,2,1], 3)); console.log(f([2,3,5,8], 5)); console.log(f([4,1,3,2], 3)); console.log(f([3,3,3], 3));

找到長度為 3 的總組合,使得總和可被給定數字和 i 整除<j<k< div><div id="text_translate"><p> 所以,我一直在努力尋找問題的最佳解決方案,但我找不到小於 o(n <sup>3</sup> ) 的解決方案。</p><p> 問題陳述是:- 找到數組中三元組的總數,使得 a[i]、a[j]、a[k] 的總和可被給定數 d 整除且 i<j<k。</p><p> 我嘗試了多種解決方案,但解決方案都達到了 o(n <sup>3</sup> )。 我需要一個可能小於 o(n <sup>3</sup> ) 的解決方案</p></div></j<k<>

[英]Find total combinations of length 3 such that sum is divisible by a given number and i<j<k

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM