Skip to content

Commit da3fd25

Browse files
author
Ziming M
committed
original commit
1 parent 64fb742 commit da3fd25

7 files changed

+298
-0
lines changed

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
# 「LeetCode-Python3习题集」使用说明
2+
3+
[![HitCount](http://hits.dwyl.io/ML-ZimingMeng/LeetCode-Python3.svg)](http://hits.dwyl.io/ML-ZimingMeng/LeetCode-Python3) [![GitHub license](https://img.shields.io/travis/ML-ZimingMeng/LeetCode-Python3.svg)](https://github.com/ML-ZimingMeng/LeetCode-Python3/blob/master/LICENSE)
4+
25
## 简介
36
「LeetCode-Python3习题集」是本人在LeetCode上的刷题题解,采用Python3书写,供个人参考和学习交流使用。
47
## 如何刷题
+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# 假设你设计一个游戏,用一个 m 行 n 列的 2D 网格来存储你的游戏地图。
2+
#
3+
# 起始的时候,每个格子的地形都被默认标记为「水」。我们可以通过使用 addLand 进行操作,将位置 (row, col) 的「水」变成「陆地」。
4+
#
5+
# 你将会被给定一个列表,来记录所有需要被操作的位置,然后你需要返回计算出来 每次 addLand 操作后岛屿的数量。
6+
#
7+
# 注意:一个岛的定义是被「水」包围的「陆地」,通过水平方向或者垂直方向上相邻的陆地连接而成。你可以假设地图网格的四边均被无边无际的「水」所包围。
8+
#
9+
# 请仔细阅读下方示例与解析,更加深入了解岛屿的判定。
10+
#
11+
# 示例:
12+
#
13+
# 输入: m = 3, n = 3, positions = [[0,0], [0,1], [1,2], [2,1]]
14+
# 输出: [1,1,2,3]
15+
# 解析:
16+
#
17+
# 起初,二维网格 grid 被全部注入「水」。(0 代表「水」,1 代表「陆地」)
18+
#
19+
# 0 0 0
20+
# 0 0 0
21+
# 0 0 0
22+
23+
24+
class Solution:
25+
def numIslands2(self, m: int, n: int, positions: List[List[int]]) -> List[int]:
26+
27+
grid = [[0] * n for _ in range(m)] # 构建保存岛屿的表格
28+
island = collections.defaultdict(set) # 保存岛屿编号和坐标的哈希表
29+
30+
directions = [(1, 0), (-1, 0), (0, -1), (0, 1)] # 上下左右四个方向
31+
32+
index = 1 # 初始化岛屿编号
33+
34+
res = []
35+
36+
for x, y in positions: # 对每个位置进行遍历
37+
if grid[x][y]: # 如果该位置已经有岛屿编号
38+
res.append(len(island)) # 直接在结果中添加当前哈希表的长度
39+
continue # 跳过
40+
41+
mark = [] # 记录上下左右四个岛屿的编号
42+
for dx, dy in directions: # 对上下左右进行遍历
43+
# 当坐标合法,且该坐标为岛屿时,加入mark
44+
# 为防止有重复值出现,需要判断该值是否在mark中
45+
if 0 <= x + dx < m and 0 <= y + dy < n and grid[x + dx][y + dy] and grid[x + dx][y + dy] not in mark:
46+
mark.append(grid[x + dx][y + dy])
47+
48+
if len(mark) == 0: # mark为空,即上下左右都为海洋
49+
grid[x][y] = index # 更新该点在grid中的值
50+
island[index].add((x, y)) # 更新哈希表island
51+
index += 1 # index + 1
52+
53+
else:
54+
temp = mark[0] # 如果mark不为空,将mark中所有的岛屿编号统一
55+
grid[x][y] = temp # 设定mark[0],即temp为统一值
56+
island[temp].add((x, y)) # 更新grid[x][y]和哈希表island
57+
58+
for num in mark[1:]: # 对于mark中的其他岛屿编号
59+
for i, j in island[num]: # 从哈希表中取出其所有点的坐标i,j
60+
grid[i][j] = temp # 更新grid[i][j]
61+
island[temp] |= island[num] # 更新temp所对应的哈希表,将num对应的坐标加入其中
62+
del island[num] # 删除哈希表中num的条目
63+
64+
res.append(len(island)) # 在结果中添加当前哈希表island的长度
65+
66+
return res
67+
68+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# 给定编号从 0 到 n-1 的 n 个节点和一个无向边列表(每条边都是一对节点),请编写一个函数来计算无向图中连通分量的数目。
2+
#
3+
# 示例 1:
4+
#
5+
# 输入: n = 5 和 edges = [[0, 1], [1, 2], [3, 4]]
6+
#
7+
# 0 3
8+
# | |
9+
# 1 --- 2 4
10+
#
11+
# 输出: 2
12+
13+
class Solution:
14+
def countComponents(self, n: int, edges: List[List[int]]) -> int:
15+
f = {}
16+
17+
def find(x):
18+
f.setdefault(x, x)
19+
if x != f[x]:
20+
f[x] = find(f[x])
21+
return f[x]
22+
23+
def union(x, y):
24+
f[find(x)] = find(y)
25+
26+
for x, y in edges:
27+
union(x, y)
28+
return len(set(find(x) for x in range(n)))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# 假设你设计一个游戏,用一个 m 行 n 列的 2D 网格来存储你的游戏地图。
2+
#
3+
# 起始的时候,每个格子的地形都被默认标记为「水」。我们可以通过使用 addLand 进行操作,将位置 (row, col) 的「水」变成「陆地」。
4+
#
5+
# 你将会被给定一个列表,来记录所有需要被操作的位置,然后你需要返回计算出来 每次 addLand 操作后岛屿的数量。
6+
#
7+
# 注意:一个岛的定义是被「水」包围的「陆地」,通过水平方向或者垂直方向上相邻的陆地连接而成。你可以假设地图网格的四边均被无边无际的「水」所包围。
8+
#
9+
# 请仔细阅读下方示例与解析,更加深入了解岛屿的判定。
10+
#
11+
# 示例:
12+
#
13+
# 输入: m = 3, n = 3, positions = [[0,0], [0,1], [1,2], [2,1]]
14+
# 输出: [1,1,2,3]
15+
# 解析:
16+
#
17+
# 起初,二维网格 grid 被全部注入「水」。(0 代表「水」,1 代表「陆地」)
18+
#
19+
# 0 0 0
20+
# 0 0 0
21+
# 0 0 0
22+
23+
24+
class Solution:
25+
def numIslands2(self, m: int, n: int, positions: List[List[int]]) -> List[int]:
26+
27+
grid = [[0] * n for _ in range(m)] # 构建保存岛屿的表格
28+
island = collections.defaultdict(set) # 保存岛屿编号和坐标的哈希表
29+
30+
directions = [(1, 0), (-1, 0), (0, -1), (0, 1)] # 上下左右四个方向
31+
32+
index = 1 # 初始化岛屿编号
33+
34+
res = []
35+
36+
for x, y in positions: # 对每个位置进行遍历
37+
if grid[x][y]: # 如果该位置已经有岛屿编号
38+
res.append(len(island)) # 直接在结果中添加当前哈希表的长度
39+
continue # 跳过
40+
41+
mark = [] # 记录上下左右四个岛屿的编号
42+
for dx, dy in directions: # 对上下左右进行遍历
43+
# 当坐标合法,且该坐标为岛屿时,加入mark
44+
# 为防止有重复值出现,需要判断该值是否在mark中
45+
if 0 <= x + dx < m and 0 <= y + dy < n and grid[x + dx][y + dy] and grid[x + dx][y + dy] not in mark:
46+
mark.append(grid[x + dx][y + dy])
47+
48+
if len(mark) == 0: # mark为空,即上下左右都为海洋
49+
grid[x][y] = index # 更新该点在grid中的值
50+
island[index].add((x, y)) # 更新哈希表island
51+
index += 1 # index + 1
52+
53+
else:
54+
temp = mark[0] # 如果mark不为空,将mark中所有的岛屿编号统一
55+
grid[x][y] = temp # 设定mark[0],即temp为统一值
56+
island[temp].add((x, y)) # 更新grid[x][y]和哈希表island
57+
58+
for num in mark[1:]: # 对于mark中的其他岛屿编号
59+
for i, j in island[num]: # 从哈希表中取出其所有点的坐标i,j
60+
grid[i][j] = temp # 更新grid[i][j]
61+
island[temp] |= island[num] # 更新temp所对应的哈希表,将num对应的坐标加入其中
62+
del island[num] # 删除哈希表中num的条目
63+
64+
res.append(len(island)) # 在结果中添加当前哈希表island的长度
65+
66+
return res
67+
68+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# 给定编号从 0 到 n-1 的 n 个节点和一个无向边列表(每条边都是一对节点),请编写一个函数来计算无向图中连通分量的数目。
2+
#
3+
# 示例 1:
4+
#
5+
# 输入: n = 5 和 edges = [[0, 1], [1, 2], [3, 4]]
6+
#
7+
# 0 3
8+
# | |
9+
# 1 --- 2 4
10+
#
11+
# 输出: 2
12+
13+
class Solution:
14+
def countComponents(self, n: int, edges: List[List[int]]) -> int:
15+
f = {}
16+
17+
def find(x):
18+
f.setdefault(x, x)
19+
if x != f[x]:
20+
f[x] = find(f[x])
21+
return f[x]
22+
23+
def union(x, y):
24+
f[find(x)] = find(y)
25+
26+
for x, y in edges:
27+
union(x, y)
28+
return len(set(find(x) for x in range(n)))
+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# 给你一个字符串
2+
# s,它仅由字母
3+
# 'a'
4+
# 和
5+
# 'b'
6+
# 组成。每一次删除操作都可以从
7+
# s
8+
# 中删除一个回文
9+
# 子序列。
10+
#
11+
# 返回删除给定字符串中所有字符(字符串为空)的最小删除次数。
12+
#
13+
# 「子序列」定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。
14+
#
15+
# 「回文」定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文。
16+
#
17+
#
18+
#
19+
# 示例
20+
# 1:
21+
#
22+
# 输入:s = "ababa"
23+
# 输出:1
24+
# 解释:字符串本身就是回文序列,只需要删除一次。
25+
# 示例
26+
# 2:
27+
#
28+
# 输入:s = "abb"
29+
# 输出:2
30+
# 解释:"abb" -> "bb" -> "".
31+
# 先删除回文子序列
32+
# "a",然后再删除
33+
# "bb"。
34+
# 示例
35+
# 3:
36+
#
37+
# 输入:s = "baabb"
38+
# 输出:2
39+
# 解释:"baabb" -> "b" -> "".
40+
# 先删除回文子序列
41+
# "baab",然后再删除
42+
# "b"。
43+
# 示例
44+
# 4:
45+
#
46+
# 输入:s = ""
47+
# 输出:0
48+
#
49+
# 提示:
50+
#
51+
# 0 <= s.length <= 1000
52+
# s
53+
# 仅包含字母
54+
# 'a'
55+
# 和
56+
# 'b'
57+
58+
class Solution:
59+
def removePalindromeSub(self, s: str) -> int:
60+
if s == '':
61+
return 0
62+
elif s == s[::-1]:
63+
return 1
64+
else:
65+
return 2

source/weeks/5320.餐厅过滤器.py

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# 给你一个餐馆信息数组 restaurants,其中  restaurants[i] = [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息。
2+
#
3+
# 其中素食者友好过滤器 veganFriendly 的值可以为 true 或者 false,如果为 true 就意味着你应该只包括 veganFriendlyi 为 true 的餐馆,为 false 则意味着可以包括任何餐馆。此外,我们还有最大价格 maxPrice 和最大距离 maxDistance 两个过滤器,它们分别考虑餐厅的价格因素和距离因素的最大值。
4+
#
5+
# 过滤后返回餐馆的 id,按照 rating 从高到低排序。如果 rating 相同,那么按 id 从高到低排序。简单起见, veganFriendlyi 和 veganFriendly 为 true 时取值为 1,为 false 时,取值为 0 。
6+
#
7+
#  
8+
#
9+
# 示例 1:
10+
#
11+
# 输入:restaurants = [[1,4,1,40,10],[2,8,0,50,5],[3,8,1,30,4],[4,10,0,10,3],[5,1,1,15,1]], veganFriendly = 1, maxPrice = 50, maxDistance = 10
12+
# 输出:[3,1,5]
13+
# 解释:
14+
# 这些餐馆为:
15+
# 餐馆 1 [id=1, rating=4, veganFriendly=1, price=40, distance=10]
16+
# 餐馆 2 [id=2, rating=8, veganFriendly=0, price=50, distance=5]
17+
# 餐馆 3 [id=3, rating=8, veganFriendly=1, price=30, distance=4]
18+
# 餐馆 4 [id=4, rating=10, veganFriendly=0, price=10, distance=3]
19+
# 餐馆 5 [id=5, rating=1, veganFriendly=1, price=15, distance=1]
20+
# 在按照 veganFriendly = 1, maxPrice = 50 和 maxDistance = 10 进行过滤后,我们得到了餐馆 3, 餐馆 1 和 餐馆 5(按评分从高到低排序)。
21+
22+
class Solution:
23+
def filterRestaurants(self, restaurants: List[List[int]], veganFriendly: int, maxPrice: int, maxDistance: int) -> List[int]:
24+
dic = {}
25+
for restaurant in restaurants:
26+
if veganFriendly == 0:
27+
if restaurant[3] <= maxPrice and restaurant[4] <= maxDistance:
28+
dic[restaurant[0]] = restaurant[1]
29+
else:
30+
if restaurant[3] <= maxPrice and restaurant[4] <= maxDistance and restaurant[2] == 1:
31+
dic[restaurant[0]] = restaurant[1]
32+
res = []
33+
# 按照 rating 从高到低排序。如果 rating 相同,那么按 id 从高到低排序。
34+
dic = sorted(dic.items(), key = lambda x:[x[1],x[0]],reverse=True)
35+
for i in dic:
36+
res.append(i[0])
37+
return res
38+

0 commit comments

Comments
 (0)