Leetcode 3548. Equal Sum Grid Partition II

1. 解题思路

这一题是题目3546. Equal Sum Grid Partition I的进阶版本,不过本质上还是差不多的。

相较于题目3546,这里的改动是可以允许至多一个元素的清零,但不能使得区域不连续。

因此,我们就是分别要在横向和纵向考察以每一个位置进行切分时,两侧的元素差,然后考察较多的那一部分是否恰好有与差值完全相同的元素,且这个元素如果被去除的话是否会将对应的区域完全切断开来,这个我们只需要分类考察一下即可。

2. 代码实现

给出python代码实现如下:

class Solution:
    def canPartitionGrid(self, grid: List[List[int]]) -> bool:
        n, m = len(grid), len(grid[0])
        cnt = defaultdict(int)
        tot = 0
        for i in range(n):
            for j in range(m):
                cnt[grid[i][j]] += 1
                tot += grid[i][j]
                
        _cnt = defaultdict(int)
        _tot = 0
        for i in range(n-1):
            for j in range(m):
                _cnt[grid[i][j]] += 1
                _tot += grid[i][j]

            delta = 2 * _tot - tot
            if delta == 0:
                return True
            elif delta > 0:
                if _cnt[delta] > 0 and i > 0 and m > 1:
                    return True
                elif i > 0 and m == 1 and (grid[0][0] == delta or grid[i][0] == delta):
                    return True
                elif i == 0 and (grid[0][0] == delta or grid[0][-1] == delta):
                    return True
            else:
                if cnt[-delta] - _cnt[-delta] > 0 and i < n-2 and m > 1:
                    return True
                elif i < n-2 and m == 1 and (grid[-1][0] == -delta or grid[i+1][0] == -delta):
                    return True
                elif i == n-2 and (grid[-1][0] == -delta or grid[-1][-1] == -delta):
                    return True
        
        _cnt = defaultdict(int)
        _tot = 0
        for j in range(m-1):
            for i in range(n):
                _cnt[grid[i][j]] += 1
                _tot += grid[i][j]

            delta = 2 * _tot - tot
            if delta == 0:
                return True
            elif delta > 0:
                if _cnt[delta] > 0 and j > 0 and n > 1:
                    return True
                elif j > 0 and n == 1 and (grid[0][0] == delta or grid[0][j] == delta):
                    return True
                elif j == 0 and (grid[0][0] == delta or grid[-1][0] == delta):
                    return True
            else:
                if cnt[-delta] - _cnt[-delta] > 0 and j < m-2 and n > 1:
                    return True
                elif j < m-2 and n == 1 and (grid[0][-1] == -delta or grid[0][j+1] == -delta):
                    return True
                elif j == m-2 and (grid[0][-1] == -delta or grid[-1][-1] == -delta):
                    return True
        return False      

提交代码评测得到:耗时847ms,占用内存57.9MB。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值