Leetcode 465. Optimal Account Balancing (python+cpp)

本文详细解析LeetCode 465题,探讨如何通过回溯法(backtracking)解决账户平衡问题。文章提供了Python和C++两种语言的代码实现,并指出该问题本质上是一个暴力求解(brutal force)的过程,需要清空每个账户并确保账户组的总和为0。二刷题目时,作者注意到可以通过排序账户值优化搜索过程,避免重复组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Leetcode 465. Optimal Account Balancing

题目

在这里插入图片描述

解析:

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

这个问题有许多的解法,但是我个人认为比较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]] -= t[2]
            memo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值