力扣每日一题(五十八——周赛题目)

题目描述:

示例:

 

思路:

这道题我们使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值