中级农民
- 积分
- 104
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2019-4-28
- 最后登录
- 1970-1-1
|
第三題想了一下, 應該算 LC 2158 的變種吧 , 2D 的 2158
2158 有一種解法是用 把每一個區間的點當成 key, 然後 end 的點存成 value, 這樣就可以避免重複
->
class Solution:
def amountPainted(self, paint: List[List[int]]) -> List[int]:
ans = []
seen = {}
for start, end in paint:
cnt = 0
while start < end:
if start in seen:
start = seen[start]
else:
seen[start] = end
cnt += 1
start += 1
ans.append(cnt)
return ans
所以應該只要把每一個 row 當成一個 2158 的 1D array, 然後 sort window array, 讓 size 數字越大的越先處理, 這樣應該可以更簡化一些 ?
def findAllSquare(self, squares: list, windows: List[List[int]]):
# each item in squares is like [(startx, starty), (endx, endy), size]
record = defaultdict(int)
squares.sort(key=lambda x: -x[2])
counter = defaultdict(int)
for i, s in enumerate(squares):
endy = s[1][1]
j = s[0][1]
for i in range(s[0][0], s[1][0]+1):
while j <= s[1][1]:
if (i, j) in record: # 已經有更大的size 直接跳到 結束的點
j = record[(i,j)]
else:
windows[i][j] = s[2] # 還沒有更大的size, record當前的size
record[(i,j)] = endy+1
for i in range(len(windows)):
for j in range(len(windows[0])):
counter[windows[i][j]] += 1
return counter
|
|