力扣第 171 场双周赛

3765. 完全质数 - 力扣(LeetCode)

题目类型

#数学

解题思路

参考:这道题很简单!

示例代码

python
class Solution:
    def completePrime(self, num: int) -> bool:
        s = str(num)
        n = len(s)

        def is_prime(n):
            for i in range(2, int(n**0.5) + 1):
                if n % i == 0:
                    return False
            return True if n > 1 else False

        flag = True
        for i in range(1, n + 1):
            x = int(s[:i])
            flag &= is_prime(x)
            y = int(s[-i:])
            flag &= is_prime(y)
        return flag

3766. 将数字变成二进制回文数的最少操作 - 力扣(LeetCode)

题目类型

#预处理 #二分

解题思路

参考:这道题很简单!

示例代码

python
cnt = []
for x in range(1, 5001):
    s = bin(x)[2:]
    if s == s[::-1]:
        cnt.append(x)


class Solution:
    def minOperations(self, nums: List[int]) -> List[int]:
        n = len(nums)
        ans = [inf] * n
        for i, x in enumerate(nums):
            idx = bisect_left(cnt, x)
            for j in range(max(0, idx - 5), min(len(cnt), idx + 5)):
                ans[i] = min(ans[i], abs(cnt[j] - x))
        return ans

3767. 选择 K 个任务的最大总分数 - 力扣(LeetCode)

题目类型

#贪心 #排序

解题思路

参考:这道题很简单!

示例代码

python
class Solution:
    def maxPoints(self, t1: List[int], t2: List[int], k: int) -> int:
        t = sorted([[x, y] for x, y in zip(t1, t2)], key=lambda p: p[1] - p[0])
        ans = 0
        for x, y in t:
            if k:
                ans += x
                k -= 1
            elif x > y:
                ans += x
            else:
                ans += y
        return ans

3768. 固定长度子数组中的最小逆序对数目 - 力扣(LeetCode)

题目类型

#树状数组 #有序集合 #离散化 #定长滑窗

解题思路

滑窗的同时,实时维护窗口内的逆序对个数 invinv

  • 元素 xx 进入窗口时,invinv 增加了窗口内的大于 xx 的元素个数。
  • 元素 xx 离开窗口时,invinv 减少了窗口内的小于 xx 的元素个数。

参考:定长滑窗 + 离散化 + 值域树状数组(Python/Java/C++/Go)

示例代码

python
class Solution:
    def minInversionCount(self, nums: List[int], k: int) -> int:
        n = len(nums)
        d = {x: i for i, x in enumerate(sorted(set(nums)), 1)}
        m = len(d)
        tree = FenwickTree(m + 1)
        cur = 0
        ans = k * (k - 1) // 2
        pre = [0] * (n + 1)
        for i, x in enumerate(nums, 1):
            cur += tree.range_query(d[x] + 1, m)
            tree.update(d[x], 1)
            if i < k:
	            continue
			ans = min(ans, cur)
			cur -= tree.range_query(1, d[nums[i - k]] - 1)
			tree.update(d[nums[i - k]], -1)
        return ans
py
class Fenwick:
    __slots__ = ["n", "c"]

    def __init__(self, n):
        self.n = n
        self.c = [0] * (n + 1)

    def update(self, x: int, delta: int):
        while x <= self.n:
            self.c[x] += delta
            x += x & -x

    def query(self, x: int) -> int:
        s = 0
        while x > 0:
            s += self.c[x]
            x -= x & -x
        return s
力扣第 479 场周赛
力扣第 478 场周赛
Valaxy v0.28.4 驱动|主题-Yunv0.28.5
本站总浏览量: -本站总访客数: -
本站已运行0 天0 小时0 分0 秒