仅以此纪录每日LeetCode所刷题目。
题目描述:
示例:
思路:
这道题需要同时使用BFS + DFS,因为题目中已经明确说明图中含有两座岛,因此我们首先使用DFS搜索出其中的任意一座岛屿,将这座岛屿的坐标放在一个队列中,下一步我们使用BFS,一个格子一个格子的向外扩充,如果某次碰到了另外一个岛屿,则返回对应的step即可。
代码:
class Solution:
def shortestBridge(self, grid: List[List[int]]) -> int:
def dfs(i,j):
if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] == 0 or grid[i][j] == 2:
return
else:
grid[i][j] = 2
q.append((i,j))
for x,y in dirs:
new_x = x+i
new_y = y+j
dfs(new_x,new_y)
def bfs(i,j):
steps = 0
while q:
size = len(q)
for _ in range(size):
i,j = q.popleft()
for x,y in dirs:
new_x = i + x
new_y = j + y
if new_x < 0 or new_x >= len(grid) or new_y < 0 or new_y >= len(grid[0]) or grid[new_x][new_y] == 2:
continue
if grid[new_x][new_y] == 1:
return steps
grid[new_x][new_y] = 2
q.append((new_x,new_y))
steps += 1
q = collections.deque()
dirs = ((-1,0),(1,0),(0,-1),(0,1))
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 1:
dfs(i,j)
return bfs(i,j)
题目描述:
示例:
思路:
这道题相当于求岛屿的面积之和,首先我们要将不是岛屿的陆地(该岛屿的陆地在给出地图的边界上)赋值成0,来方便我们后续的计算,这一步我们使用BFS,从地图的四周出发,完成赋值,之后我们遍历地图,找到为1的陆地面积之和即可。
代码:
class Solution:
def numEnclaves(self, grid: List[List[int]]) -> int:
def bfs(x,y):
grid[x][y] = 0
for i,j in dirs:
new_x = x + i
new_y = y + j
if new_x < 0 or new_x >= len(grid) or new_y < 0 or new_y >= len(grid[0]) or grid[new_x][new_y] == 2:
continue
if grid[new_x][new_y] == 1:
bfs(new_x,new_y)
return
dirs = ((1,0),(-1,0),(0,1),(0,-1))
for i in range(len(grid)):
if grid[i][0] == 1:
bfs(i,0)
for i in range(len(grid[0])):
if grid[0][i] == 1:
bfs(0,i)
for i in range(len(grid)):
if grid[i][len(grid[0])-1] == 1:
bfs(i,len(grid[0])-1)
for i in range(len(grid[0])):
if grid[len(grid)-1][i] == 1:
bfs(len(grid)-1,i)
count = 0
for k in range(len(grid)):
for j in range(len(grid[0])):
if grid[k][j] == 1:
count += 1
return count
题目描述:
示例:思路:
这道题和上一题(飞地的数量)思路大体相同,本题我们使用BFS将不是岛屿的陆地(该岛屿的陆地在给出地图的边界上)赋值成1,之后使用DFS来求陆地的数量。
代码:
class Solution:
def closedIsland(self, grid: List[List[int]]) -> int:
def bfs(x,y):
grid[x][y] = 1
for i,j in dirs:
new_x = x + i
new_y = y + j
if new_x < 0 or new_x >= len(grid) or new_y < 0 or new_y >= len(grid[0]) or grid[new_x][new_y] == 1:
continue
else:
bfs(new_x,new_y)
return
def dfs(x,y,grid):
grid[x][y] = 1
if x < len(grid) - 1 and grid[x+1][y] == 0:
dfs(x+1,y,grid)
if y < len(grid[0]) - 1 and grid[x][y+1] == 0:
dfs(x,y+1,grid)
if x > 0 and grid[x-1][y] == 0:
dfs(x-1,y,grid)
if y > 0 and grid[x][y-1] == 0:
dfs(x,y-1,grid)
return 0
dirs = ((1,0),(-1,0),(0,1),(0,-1))
for i in range(len(grid)):
if grid[i][0] == 0:
bfs(i,0)
for i in range(len(grid[0])):
if grid[0][i] == 0:
bfs(0,i)
for i in range(len(grid)):
if grid[i][len(grid[0])-1] == 0:
bfs(i,len(grid[0])-1)
for i in range(len(grid[0])):
if grid[len(grid)-1][i] == 0:
bfs(len(grid)-1,i)
count = 0
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 0:
count += 1
dfs(i,j,grid)
return count
题目描述:
示例:
代码:
class RandomizedSet:
def __init__(self):
self.nums = []
self.idx_map = dict()
def insert(self, val: int) -> bool:
if val not in self.idx_map:
self.idx_map[val] = len(self.nums)
self.nums.append(val)
return True
return False
def remove(self, val: int) -> bool:
if val in self.idx_map:
swap_val, idx = self.nums[-1], self.idx_map[val]
self.nums[idx] = swap_val
self.idx_map[swap_val] = idx
del self.idx_map[val]
self.nums.pop()
return True
return False
def getRandom(self) -> int:
return choice(self.nums)
题目描述:
示例:
代码:
class Solution:
def maxRotateFunction(self, nums: List[int]) -> int:
if len(nums) == 1:
return 0
res = 0
a = sum(nums)
for i in range(len(nums)):
res += i * nums[i]
max_res = res
a = a - nums[-1]
for j in range(len(nums)-1):
res = res - (len(nums)-1)*(nums[len(nums)-1-j]) + a
max_res = max(max_res,res)
a = a - nums[len(nums)-2-j] + nums[len(nums)-1-j]
return max_res