https://leetcode.com/problems/largest-plus-sign/
你会得到一个大小为n*n 的表格,接着你要在表格中划出一个最大的十字,并回传他从中心点对任一边延伸出去几格,但是有两个条件需要遵守:
第一,你画出来的十字需要四个方向都一样长
第二,在阵列mines 中标示着不能画到的座标,依照题目为这变数取的名字来看,你画到的话就会被炸死
这一题如果用暴力解法的话感觉就过不了O(n^3) ,所以我们用动态规划(Dynamic Programming)来减少一些计算步骤。解题的想法如下:
class Solution:
def orderOfLargestPlusSign(self, n: int, mines: List[List[int]]) -> int:
dp = [[0] * n for i in range(n)]
banned = {tuple(mine) for mine in mines}
# 要用set()才会比较快,我一开始没用就超时了
for row in range(n): #左右
count = 0
for col in range(n): #左边有几格可以延伸
if (row, col) not in banned:
count += 1
else:
count = 0
dp[row][col] = count
count = 0
for col in range(n-1, -1, -1): #右边有几格可以延伸
if (row, col) not in banned:
count += 1
else:
count = 0
dp[row][col] = min(dp[row][col], count) #留下更短的那个
for col in range(n): #上下
count = 0
for row in range(n): #上面有几格可以延伸
if (row, col) not in banned:
count += 1
else:
count = 0
dp[row][col] = min(dp[row][col], count) #留下更短的那个
count = 0
for row in range(n-1, -1, -1): #下面有几格可以延伸
if (row, col) not in banned:
count += 1
else:
count = 0
dp[row][col] = min(dp[row][col], count) #留下更短的那个
ans = 0
for i in dp:
ans = max(max(i), ans) #回传最大的那个
return ans
感觉我今天讲解的满烂的,实在是不知道要怎麽写才好,如果有动画的话会更好理解
另外,如果有不认识DP的读者,蛮建议照着这网页用DP练习写费氏数列,稍微体验一下DP的感觉
>>: Day9 - 读 Concurrency is not Parallelism - Rob Pike (四)
二维阵列通常是用来描述表格、座位表、计算两班成绩或是同一班两科成绩做比较...凡是描述二维空间的基本...
前言 今天要来介绍 泛用型别,在我们前面介绍的 型别化名 ,而 泛用型别 就是将 型别化名 参数化,...
今天就来继续介绍 trait、parent、association、alias! alias 简单来...
每间公司的开发都需要仰赖大量的资料,这也成为公司最重要的资产,而究竟什麽是效能监控呢,就好比资料表是...
今年初,航海王的崛起,拉开了大航海时代;台指期屡创新高,大家前仆後继地涌入了大股海之中,开户人数屡创...