Skip to content

Commit 6ed09b2

Browse files
author
Ziming M
committed
original commit
1 parent 1ec7e6d commit 6ed09b2

8 files changed

+367
-1
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
## 关于作者
4040
- 我的博客:[ziming.xyz](https://www.ziming.xyz/)
4141
- LeetCode主页:[Pumpkin🎃](https://leetcode-cn.com/u/ml-zimingmeng/)
42-
- 微信: [🔰Wechat](/me/wechat.png)
42+
- 微信: [🔰Wechat](/me/wechat.jpg)
4343
## 结尾
4444
- 为了带来最佳的阅读体验,本文遵循[「中文文案排版指北」](https://github.com/mzlogin/chinese-copywriting-guidelines)
4545
- 更多 Markdown 语法,请查看 [官方文档](https://www.markdownguide.org/basic-syntax/)

me/wechat.jpg

23.1 KB
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# 有一队人(两人或以上)想要在一个地方碰面,他们希望能够最小化他们的总行走距离。
2+
3+
# 给你一个 2D 网格,其中各个格子内的值要么是 0,要么是 1。
4+
5+
# 1 表示某个人的家所处的位置。这里,我们将使用 曼哈顿距离 来计算,其中 distance(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|。
6+
7+
# 示例:
8+
9+
# 输入:
10+
11+
# 1 - 0 - 0 - 0 - 1
12+
# | | | | |
13+
# 0 - 0 - 0 - 0 - 0
14+
# | | | | |
15+
# 0 - 0 - 1 - 0 - 0
16+
17+
# 输出: 6
18+
19+
# 解析: 给定的三个人分别住在(0,0),(0,4) 和 (2,2):
20+
#   (0,2) 是一个最佳的碰面点,其总行走距离为 2 + 2 + 2 = 6,最小,因此返回 6。
21+
22+
class Solution:
23+
def minTotalDistance(self, grid: List[List[int]]) -> int:
24+
if len(grid) == 0 or len(grid[0]) == 0: return 0
25+
n, m = len(grid), len(grid[0])
26+
lx, ly = [], []
27+
for y in range(n):
28+
for x in range(m):
29+
if grid[y][x] == 1:
30+
lx.append(x)
31+
ly.append(y)
32+
lx.sort()
33+
ly.sort()
34+
cnt = len(lx)
35+
mx, my = lx[cnt >> 1], ly[cnt >> 1]
36+
res = 0
37+
for x in lx: res += abs(x - mx)
38+
for y in ly: res += abs(y - my)
39+
return res
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# 你是个房地产开发商,想要选择一片空地 建一栋大楼。你想把这栋大楼够造在一个距离周边设施都比较方便的地方,通过调研,你希望从它出发能在 最短的距离和 内抵达周边全部的建筑物。请你计算出这个最佳的选址到周边全部建筑物的 最短距离和。
2+
#
3+
#  
4+
#
5+
# 注意:
6+
#
7+
# 你只能通过向上、下、左、右四个方向上移动。
8+
#
9+
# 给你一个由 0、1 和 2 组成的二维网格,其中:
10+
#
11+
# 0 代表你可以自由通过和选择建造的空地
12+
# 1 代表你无非通行的建筑物
13+
# 2 代表你无非通行的障碍物
14+
#  
15+
#
16+
# 示例:
17+
#
18+
# 输入: [[1,0,2,0,1],[0,0,0,0,0],[0,0,1,0,0]]
19+
#
20+
# 1 - 0 - 2 - 0 - 1
21+
# | | | | |
22+
# 0 - 0 - 0 - 0 - 0
23+
# | | | | |
24+
# 0 - 0 - 1 - 0 - 0
25+
#
26+
# 输出: 7
27+
#
28+
# 解析:
29+
# 给定三个建筑物 (0,0)、(0,4) 和 (2,2) 以及一个位于 (0,2) 的障碍物。
30+
# 由于总距离之和 3+3+1=7 最优,所以位置 (1,2) 是符合要求的最优地点,故返回7。
31+
32+
import queue
33+
import sys
34+
35+
36+
class Solution:
37+
def shortestDistance(self, grid: List[List[int]]) -> int:
38+
r = len(grid)
39+
c = len(grid[0])
40+
count = [[0 for _ in range(c)] for _ in range(r)]
41+
dist = [[0 for _ in range(c)] for _ in range(r)]
42+
d = [[0, 1], [0, -1], [1, 0], [-1, 0]]
43+
buildings = 0
44+
45+
# initial
46+
for i in range(r):
47+
for j in range(c):
48+
if grid[i][j] == 1:
49+
buildings += 1
50+
qu = queue.Queue()
51+
visit = [[0 for _ in range(c)] for _ in range(r)]
52+
53+
qu.put((i, j))
54+
visit[i][j] = 1
55+
step = 0
56+
while not qu.empty():
57+
sz = qu.qsize()
58+
step += 1
59+
60+
for k in range(sz):
61+
curr = qu.get()
62+
for m in range(4):
63+
x = curr[0] + d[m][0]
64+
y = curr[1] + d[m][1]
65+
if x >= 0 and x < r and y >= 0 and y < c:
66+
if visit[x][y] == 0 and grid[x][y] == 0:
67+
visit[x][y] = 1
68+
count[x][y] += 1
69+
dist[x][y] += step
70+
qu.put((x, y))
71+
72+
res = sys.maxsize
73+
for i in range(0, r):
74+
for j in range(0, c):
75+
if grid[i][j] == 0 and count[i][j] == buildings:
76+
res = min(res, dist[i][j])
77+
78+
if res == sys.maxsize:
79+
return -1
80+
else:
81+
return res
82+
83+
84+
+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# 想象一下炸弹人游戏,在你面前有一个二维的网格来表示地图,网格中的格子分别被以下三种符号占据:
2+
#
3+
# 'W' 表示一堵墙
4+
# 'E' 表示一个敌人
5+
# '0'(数字 0)表示一个空位
6+
#
7+
#
8+
# 请你计算一个炸弹最多能炸多少敌人。
9+
#
10+
# 由于炸弹的威力不足以穿透墙体,炸弹只能炸到同一行和同一列没被墙体挡住的敌人。
11+
#
12+
# 注意:你只能把炸弹放在一个空的格子里
13+
#
14+
# 示例:
15+
#
16+
# 输入: [["0","E","0","0"],["E","0","W","E"],["0","E","0","0"]]
17+
# 输出: 3
18+
# 解释: 对于如下网格
19+
#
20+
# 0 E 0 0
21+
# E 0 W E
22+
# 0 E 0 0
23+
#
24+
# 假如在位置 (1,1) 放置炸弹的话,可以炸到 3 个敌人
25+
26+
class Solution:
27+
def maxKilledEnemies(self, grid: List[List[str]]) -> int:
28+
if not grid: return 0
29+
r = len(grid)
30+
c = len(grid[0])
31+
32+
def cal(row,col):
33+
res = 0
34+
left,right = col - 1,col + 1
35+
while left >= 0 and grid[row][left] != "W":
36+
if grid[row][left] == 'E':
37+
res += 1
38+
left -= 1
39+
while right < c and grid[row][right] != 'W':
40+
if grid[row][right] == 'E':
41+
res += 1
42+
right += 1
43+
up,down = row - 1,row + 1
44+
while up >= 0 and grid[up][col] != 'W':
45+
if grid[up][col] == 'E':
46+
res += 1
47+
up -= 1
48+
while down < r and grid[down][col] != 'W':
49+
if grid[down][col] == 'E':
50+
res += 1
51+
down += 1
52+
return res
53+
res = 0
54+
for i in range(r):
55+
for j in range(c):
56+
if grid[i][j] == "0":
57+
res = max(res,cal(i,j))
58+
return res
59+
60+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# 有一队人(两人或以上)想要在一个地方碰面,他们希望能够最小化他们的总行走距离。
2+
3+
# 给你一个 2D 网格,其中各个格子内的值要么是 0,要么是 1。
4+
5+
# 1 表示某个人的家所处的位置。这里,我们将使用 曼哈顿距离 来计算,其中 distance(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|。
6+
7+
# 示例:
8+
9+
# 输入:
10+
11+
# 1 - 0 - 0 - 0 - 1
12+
# | | | | |
13+
# 0 - 0 - 0 - 0 - 0
14+
# | | | | |
15+
# 0 - 0 - 1 - 0 - 0
16+
17+
# 输出: 6
18+
19+
# 解析: 给定的三个人分别住在(0,0),(0,4) 和 (2,2):
20+
#   (0,2) 是一个最佳的碰面点,其总行走距离为 2 + 2 + 2 = 6,最小,因此返回 6。
21+
22+
class Solution:
23+
def minTotalDistance(self, grid: List[List[int]]) -> int:
24+
if len(grid) == 0 or len(grid[0]) == 0: return 0
25+
n, m = len(grid), len(grid[0])
26+
lx, ly = [], []
27+
for y in range(n):
28+
for x in range(m):
29+
if grid[y][x] == 1:
30+
lx.append(x)
31+
ly.append(y)
32+
lx.sort()
33+
ly.sort()
34+
cnt = len(lx)
35+
mx, my = lx[cnt >> 1], ly[cnt >> 1]
36+
res = 0
37+
for x in lx: res += abs(x - mx)
38+
for y in ly: res += abs(y - my)
39+
return res
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# 你是个房地产开发商,想要选择一片空地 建一栋大楼。你想把这栋大楼够造在一个距离周边设施都比较方便的地方,通过调研,你希望从它出发能在 最短的距离和 内抵达周边全部的建筑物。请你计算出这个最佳的选址到周边全部建筑物的 最短距离和。
2+
#
3+
#  
4+
#
5+
# 注意:
6+
#
7+
# 你只能通过向上、下、左、右四个方向上移动。
8+
#
9+
# 给你一个由 0、1 和 2 组成的二维网格,其中:
10+
#
11+
# 0 代表你可以自由通过和选择建造的空地
12+
# 1 代表你无非通行的建筑物
13+
# 2 代表你无非通行的障碍物
14+
#  
15+
#
16+
# 示例:
17+
#
18+
# 输入: [[1,0,2,0,1],[0,0,0,0,0],[0,0,1,0,0]]
19+
#
20+
# 1 - 0 - 2 - 0 - 1
21+
# | | | | |
22+
# 0 - 0 - 0 - 0 - 0
23+
# | | | | |
24+
# 0 - 0 - 1 - 0 - 0
25+
#
26+
# 输出: 7
27+
#
28+
# 解析:
29+
# 给定三个建筑物 (0,0)、(0,4) 和 (2,2) 以及一个位于 (0,2) 的障碍物。
30+
# 由于总距离之和 3+3+1=7 最优,所以位置 (1,2) 是符合要求的最优地点,故返回7。
31+
32+
import queue
33+
import sys
34+
35+
36+
class Solution:
37+
def shortestDistance(self, grid: List[List[int]]) -> int:
38+
r = len(grid)
39+
c = len(grid[0])
40+
count = [[0 for _ in range(c)] for _ in range(r)]
41+
dist = [[0 for _ in range(c)] for _ in range(r)]
42+
d = [[0, 1], [0, -1], [1, 0], [-1, 0]]
43+
buildings = 0
44+
45+
# initial
46+
for i in range(r):
47+
for j in range(c):
48+
if grid[i][j] == 1:
49+
buildings += 1
50+
qu = queue.Queue()
51+
visit = [[0 for _ in range(c)] for _ in range(r)]
52+
53+
qu.put((i, j))
54+
visit[i][j] = 1
55+
step = 0
56+
while not qu.empty():
57+
sz = qu.qsize()
58+
step += 1
59+
60+
for k in range(sz):
61+
curr = qu.get()
62+
for m in range(4):
63+
x = curr[0] + d[m][0]
64+
y = curr[1] + d[m][1]
65+
if x >= 0 and x < r and y >= 0 and y < c:
66+
if visit[x][y] == 0 and grid[x][y] == 0:
67+
visit[x][y] = 1
68+
count[x][y] += 1
69+
dist[x][y] += step
70+
qu.put((x, y))
71+
72+
res = sys.maxsize
73+
for i in range(0, r):
74+
for j in range(0, c):
75+
if grid[i][j] == 0 and count[i][j] == buildings:
76+
res = min(res, dist[i][j])
77+
78+
if res == sys.maxsize:
79+
return -1
80+
else:
81+
return res
82+
83+
84+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
# 想象一下炸弹人游戏,在你面前有一个二维的网格来表示地图,网格中的格子分别被以下三种符号占据:
2+
#
3+
# 'W' 表示一堵墙
4+
# 'E' 表示一个敌人
5+
# '0'(数字 0)表示一个空位
6+
#
7+
#
8+
# 请你计算一个炸弹最多能炸多少敌人。
9+
#
10+
# 由于炸弹的威力不足以穿透墙体,炸弹只能炸到同一行和同一列没被墙体挡住的敌人。
11+
#
12+
# 注意:你只能把炸弹放在一个空的格子里
13+
#
14+
# 示例:
15+
#
16+
# 输入: [["0","E","0","0"],["E","0","W","E"],["0","E","0","0"]]
17+
# 输出: 3
18+
# 解释: 对于如下网格
19+
#
20+
# 0 E 0 0
21+
# E 0 W E
22+
# 0 E 0 0
23+
#
24+
# 假如在位置 (1,1) 放置炸弹的话,可以炸到 3 个敌人
25+
26+
class Solution:
27+
def maxKilledEnemies(self, grid: List[List[str]]) -> int:
28+
if not grid: return 0
29+
r = len(grid)
30+
c = len(grid[0])
31+
32+
def cal(row,col):
33+
res = 0
34+
left,right = col - 1,col + 1
35+
while left >= 0 and grid[row][left] != "W":
36+
if grid[row][left] == 'E':
37+
res += 1
38+
left -= 1
39+
while right < c and grid[row][right] != 'W':
40+
if grid[row][right] == 'E':
41+
res += 1
42+
right += 1
43+
up,down = row - 1,row + 1
44+
while up >= 0 and grid[up][col] != 'W':
45+
if grid[up][col] == 'E':
46+
res += 1
47+
up -= 1
48+
while down < r and grid[down][col] != 'W':
49+
if grid[down][col] == 'E':
50+
res += 1
51+
down += 1
52+
return res
53+
res = 0
54+
for i in range(r):
55+
for j in range(c):
56+
if grid[i][j] == "0":
57+
res = max(res,cal(i,j))
58+
return res
59+
60+

0 commit comments

Comments
 (0)