题目描述:
示例:
思路:
这道题我们使用BFS,我们需要建立一个状态图来存储起点到该点的最少施法次数,当我们在每个坐标上进行BFS时,总有一个方向和该坐标对应的图案方向是相同的,这个时候我们统计施法次数就不用+1,反之需要+1,当我们遍历到终点时,返回最小施法次数即可。
代码:
d = {"^": (-1, 0),"v": (1, 0),"<": (0, -1),">": (0, 1)}
class Solution:
def conveyorBelt(self, matrix: List[str], start: List[int], end: List[int]) -> int:
m, n = len(matrix), len(matrix[0])
q = deque([(0, start[0], start[1])])
book = [[1111111111] * n for _ in range(m)]
book[start[0]][start[1]] = 0
while q:
t, x, y = q.popleft()
if [x, y] == end:
return t
for dr, (dx, dy) in d.items():
nx, ny = x + dx, y + dy
if not (0 <= nx < m and 0 <= ny < n):
continue
nt = t + int(dr != matrix[x][y])
if dr == matrix[x][y]:
if book[nx][ny] <= t:
continue
book[nx][ny] = t
q.appendleft((t, nx, ny))
else:
if book[nx][ny] <= t + 1:
continue
book[nx][ny] = t + 1
q.append((t + 1, nx, ny))
题目描述:
示例:
思路:
这道题我们使用枚举法即可,枚举出所有的点(根绝给出的圆点坐标和半径,可以求出包含圆的整个正方形)。之后根据勾股定理进行判断即可。
代码:
class Solution:
def countLatticePoints(self, circles: List[List[int]]) -> int:
list1 =set()
count = 0
for i in range(len(circles)):
# a = circles[i][0] - circles[i][2]
# b = circles[i][0] + circles[i][2]
# c = circles[i][1] - circles[i][2]
# d = circles[i][1] + circles[i][2]
for j in range(circles[i][0] - circles[i][2],circles[i][0] + circles[i][2]+1):
for k in range(circles[i][1] - circles[i][2],circles[i][1] + circles[i][2]+1):
if (j-circles[i][0]) ** 2 + (k - circles[i][1]) ** 2 <= circles[i][2] ** 2:
list1.add((j,k))
return len(list1)
题目描述:
示例:
思路:
这道题我们看一下他给出的提示,y的范围是[0,100],因此我们可以首先根据y从大到小进行排序,因为我们要寻找的正方形一定是x和y都大于或者等于点的坐标值,因为y的值只有100个,所以我们最多进行100次排序,不会超时的。对于x值,我们使用二分查找即可。
代码:
class Solution:
def countRectangles(self, rectangles: List[List[int]], points: List[List[int]]) -> List[int]:
rectangles.sort(key=lambda r: -r[1])
n = len(points)
ans = [0] * n
i, xs = 0, []
for (x, y), id in sorted(zip(points, range(n)), key=lambda x: -x[0][1]):
start = i
while i < len(rectangles) and rectangles[i][1] >= y:
xs.append(rectangles[i][0])
i += 1
if start < i:
xs.sort() # 只有在 xs 插入了新元素时才排序
ans[id] = i - bisect_left(xs, x)
return ans