【leetcode413周赛】——前两题python

 3274. 检查棋盘方格颜色是否相同

给你两个字符串 coordinate1 和 coordinate2,代表 8 x 8 国际象棋棋盘上的两个方格的坐标。

以下是棋盘的参考图。

如果这两个方格颜色相同,返回 true,否则返回 false

坐标总是表示有效的棋盘方格。坐标的格式总是先字母(表示列),再数字(表示行)。

示例 1:

输入: coordinate1 = "a1", coordinate2 = "c3"

输出: true

解释:

两个方格均为黑色。

示例 2:

输入: coordinate1 = "a1", coordinate2 = "h3"

输出: false

解释:

方格 "a1" 是黑色,而 "h3" 是白色。 

提示:

  • coordinate1.length == coordinate2.length == 2
  • 'a' <= coordinate1[0], coordinate2[0] <= 'h'
  • '1' <= coordinate1[1], coordinate2[1] <= '8'
# 有一个性质,同种颜色的纵坐标加上他的和坐标的奇偶性一样
class Solution:
    def checkTwoChessboards(self, coordinate1: str, coordinate2: str) -> bool:
        if (ord(coordinate1[0]) - 96 + int(coordinate1[1])) % 2 == 0 and (ord(coordinate2[0]) - 96 + int(coordinate2[1])) % 2 == 0:
            return True
        if (ord(coordinate1[0]) - 96 + int(coordinate1[1])) % 2 != 0 and (ord(coordinate2[0]) - 96 + int(coordinate2[1])) % 2 != 0:
            return True 
        return False

3275. 第 K 近障碍物查询 

有一个无限大的二维平面。

给你一个正整数 k ,同时给你一个二维数组 queries ,包含一系列查询:

  • queries[i] = [x, y] :在平面上坐标 (x, y) 处建一个障碍物,数据保证之前的查询 不会 在这个坐标处建立任何障碍物。

每次查询后,你需要找到离原点第 k  障碍物到原点的 距离 。

请你返回一个整数数组 results ,其中 results[i] 表示建立第 i 个障碍物以后,离原地第 k 近障碍物距离原点的距离。如果少于 k 个障碍物,results[i] == -1 。

注意,一开始 没有 任何障碍物。

坐标在 (x, y) 处的点距离原点的距离定义为 |x| + |y| 。

示例 1:

输入:queries = [[1,2],[3,4],[2,3],[-3,0]], k = 2

输出:[-1,7,5,3]

解释:

最初,不存在障碍物。

  • queries[0] 之后,少于 2 个障碍物。
  • queries[1] 之后, 两个障碍物距离原点的距离分别为 3 和 7 。
  • queries[2] 之后,障碍物距离原点的距离分别为 3 ,5 和 7 。
  • queries[3] 之后,障碍物距离原点的距离分别为 3,3,5 和 7 。

示例 2:

输入:queries = [[5,5],[4,4],[3,3]], k = 1

输出:[10,8,6]

解释:

  • queries[0] 之后,只有一个障碍物,距离原点距离为 10 。
  • queries[1] 之后,障碍物距离原点距离分别为 8 和 10 。
  • queries[2] 之后,障碍物距离原点的距离分别为 6, 8 和10 。

提示:

  • 1 <= queries.length <= 2 * 10**5
  • 所有 queries[i] 互不相同。
  • -10**9 <= queries[i][0], queries[i][1] <= 10**9
  • 1 <= k <= 10**5
# 由于数据偏大,所以我们每次查找第k个值不能暴力排序再找
# 我的想法是用堆优化因为他有一个性质,总是取第k个值,当这个堆比k多的时候再在后面找,如果比第k个值大那么这个数就不用管,如果比这个数小就要加入排序。
# 每次取第k个数,且这个数是在这个堆里最大的,我们不妨想到堆排序
# 我这里用的是两个堆来维护
class Solution:
    def resultsArray(self, queries: List[List[int]], k: int) -> List[int]:
        # 建两个堆,一个是k及其k以后的数的排序,另一个是k以前的顺序
        heap1 = []
        heap2 = []
        n = len(queries)
        results = [-1] * n
        for i in range(n):
            if i < k - 1:
                heapq.heappush(heap1,(abs(queries[i][0]) + abs(queries[i][1])) * (-1))
            if i == k - 1:
                heapq.heappush(heap1,(abs(queries[i][0]) + abs(queries[i][1])) * (-1))
                heapq.heappush(heap2,int(abs((heapq.heappop(heap1)))))
                results[i] = heap2[0]
            if i > k - 1:
                if abs(queries[i][0]) + abs(queries[i][1]) >= heap2[0]:
                    results[i] = heap2[0]
                else:
                    heapq.heappush(heap1,(abs(queries[i][0]) + abs(queries[i][1])) * (-1))
                    heapq.heappush(heap2,int(abs((heapq.heappop(heap1)))))
                    results[i] = heap2[0]
        return results
# 用一个堆来维护的可以找灵神的题解。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值