Leetcode 465. Optimal Account Balancing (python+cpp)

Leetcode 465. Optimal Account Balancing

  • 题目
  • 解析:
  • 二刷

题目

Leetcode 465. Optimal Account Balancing (python+cpp)_第1张图片

解析:

这个题目手下需要进行一些预处理,这一系列的转账可以被全部简化成每个账户进行这些转账之后最后需要支出或者收入多少钱。

这个问题有许多的解法,但是我个人认为比较make sense的一种就是利用backtracking枚举所有可能的方式。具体如下:

  • 从第一个账户开始,我们现在的目标是,清空第一个账户,那么就意味着可以将第一个账户的余额加到后面任意一个非0切正负与第一个账户余额相反的账户上
  • 然后进行下一层dfs,下一层dfs就以非0的账户为起点开始
  • 需要注意的是,由于我们并不清楚有没有后面的账户在第一个账户被清0的时候也同时清0,所以需要设计一个while训话来跳过这些0
  • 同时由于是枚举所有不同的方法,所以是需要backtracking操作的

python代码:

class Solution:
    def minTransfers(self, transactions: List[List[int]]) -> int:
        def helper(account,start,count):
            nonlocal ans
            while start<len(account) and account[start]==0:
                start += 1
            if start==len(account):
                ans = min(count,ans)
                return 
            for i in range(start+1,len(account)):
                if account[i]*account[start] < 0:
                    account[i] += account[start]
                    helper(account,start+1,count+1)
                    account[i] -= account[start]
        
        memo = collections.defaultdict(int)
        
        for t in transactions:
            memo[t[0

你可能感兴趣的:(Leetcode,backtracking,leetcode,dfs,python,c++)