8.22 - hard - 88

465. Optimal Account Balancing

这道题挺有意思的,用greedy的方法

class Solution(object):
    def minTransfers(self, transactions):
        """
        :type transactions: List[List[int]]
        :rtype: int
        """
        counter = collections.Counter()
        for f, t, m in transactions:
            counter[f] -= m
            counter[t] += m
        balances = counter.values()
        def dfs(b):
            if not b:
                return 0
            # 如果第一个值为0,那么则考虑剩下来的值
            if not b[0]:
                return dfs(b[1:])
            # 如果一次合并成功,则直接合并(正好有两个人的债务相反)
            for i in range(1, len(b)):
                if b[i] == -b[0]:
                    return 1 + dfs(b[1:i] + [0] + b[i+1:])
            ret = []
            for i in range(1, len(b)):
                if b[i] * b[0] < 0: #合并连个符号相反的值
                    ret.append(dfs(b[1:i] + [b[i]+b[0]] + b[i+1:]))
            return 1+min(ret)

        return dfs(balances)

你可能感兴趣的:(8.22 - hard - 88)