(离散化 + 二维差分) LCP 74. 最强祝福力场

2023-04-30  本文已影响0人  来到了没有知识的荒原

LCP 74. 最强祝福力场

离散化 + 二维差分
灵茶山

class Solution(object):
    def fieldOfGreatestBlessing(self, forceField):
        """
        :type forceField: List[List[int]]
        :rtype: int
        """
        xs = []
        ys = []

        mp = {}
        
        for x, y, l in forceField:
            x *= 2
            y *= 2
            xs.append(x + l)
            xs.append(x - l)
            ys.append(y + l)
            ys.append(y - l)
        
        xs = sorted(xs)
        ys = sorted(ys)
        
        mpx = {v: i for i, v in enumerate(xs)}
        mpy = {v: i for i, v in enumerate(ys)}
        
        n = len(mpx)
        m = len(mpy)
        
        mat = [[0] * (m + 10) for _ in range(n  + 10)]
                
        for x, y, l in forceField:
            x *= 2
            y *= 2
            r1 = mpx[x - l] + 1
            r2 = mpx[x + l] + 1
            c1 = mpy[y - l] + 1
            c2 = mpy[y + l] + 1
            mat[r1][c1] += 1
            mat[r2 + 1][c1] -= 1
            mat[r1][c2 + 1] -= 1
            mat[r2 + 1][c2 + 1] += 1

        res = 0
        for i in range(1, n + 1):
            for j in range(1, m + 1):
                mat[i][j] += mat[i - 1][j]
                mat[i][j] += mat[i][j - 1]
                mat[i][j] -= mat[i - 1][j - 1]
                res = max(res, mat[i][j])
            
        return res

额外多处理了第0行和第0列:

class Solution(object):
    def fieldOfGreatestBlessing(self, forceField):
        """
        :type forceField: List[List[int]]
        :rtype: int
        """
        xs = []
        ys = []

        mp = {}
        
        for x, y, l in forceField:
            x *= 2
            y *= 2
            xs.append(x + l)
            xs.append(x - l)
            ys.append(y + l)
            ys.append(y - l)
        
        xs = sorted(list(set(xs)))
        ys = sorted(list(set(ys)))
        
        mpx = {v: i for i, v in enumerate(xs)}
        mpy = {v: i for i, v in enumerate(ys)}
        
        n = len(mpx)
        m = len(mpy)
        
        mat = [[0] * (m + 2) for _ in range(n + 2)]
                
        for x, y, l in forceField:
            x *= 2
            y *= 2
            r1 = mpx[x - l]
            r2 = mpx[x + l]
            c1 = mpy[y - l]
            c2 = mpy[y + l]
            mat[r1][c1] += 1
            mat[r2 + 1][c1] -= 1
            mat[r1][c2 + 1] -= 1
            mat[r2 + 1][c2 + 1] += 1

        for i in range(1, n):
            mat[i][0] += mat[i - 1][0]
        for j in range(1, m):
            mat[0][j] += mat[0][j - 1]
        
        res = 0
        for i in range(1, n):
            for j in range(1, m):
                mat[i][j] += mat[i - 1][j]
                mat[i][j] += mat[i][j - 1]
                mat[i][j] -= mat[i - 1][j - 1]
                res = max(res, mat[i][j])
            
        return res
上一篇 下一篇

猜你喜欢

热点阅读