美文网首页
LeetCode每日一题:质数运算

LeetCode每日一题:质数运算

作者: ShowMeCoding | 来源:发表于2023-03-27 20:28 被阅读0次

    2601. 质数减法运算

    给你一个下标从 0 开始的整数数组 nums ,数组长度为 n 。
    你可以执行无限次下述运算:
    选择一个之前未选过的下标 i ,并选择一个 严格小于 nums[i] 的质数 p ,从 nums[i] 中减去 p 。
    如果你能通过上述运算使得 nums 成为严格递增数组,则返回 true ;否则返回 false 。
    严格递增数组 中的每个元素都严格大于其前面的元素。

    示例 1:
    输入:nums = [4,9,6,10]
    输出:true
    解释:
    在第一次运算中:选择 i = 0 和 p = 3 ,然后从 nums[0] 减去 3 ,nums 变为 [1,9,6,10] 。
    在第二次运算中:选择 i = 1 和 p = 7 ,然后从 nums[1] 减去 7 ,nums 变为 [1,2,6,10] 。
    第二次运算后,nums 按严格递增顺序排序,因此答案为 true 。

    解题思路:第一个数减去和自己在值方面接近的最大质数,后面的数依次进行计算

    #筛质数的方法(0, 1既不是质数也不是合数)
    MX = 1000    #1 <= nums.length <= 1000
    is_prime = [True]*MX
    primes = [0]
    for i in range(2, MX):
        #当该数是质数,添加
        if is_prime[i]:
            primes.append(i)
            #质数的倍数(遍历步长为i)不是质数,因此可以提前标记(从i^2开始计算)
            for j in range(i*i, MX, i):
                is_prime[j] = False
    
    class Solution:
        def primeSubOperation(self, nums: List[int]) -> bool:
            j = bisect_left(primes, nums[0]) - 1    #找到小于nums[0]的最大质数的下标
            pre = nums[0] - primes[j]
            for i in range(1, len(nums)):
                x = nums[i]
                # 当前值已经布满条件,及时返回
                if x <= pre:
                    return False
                # 剩下的每个元素都需要满足的条件
                # x - primes[j] > pre  ==> primes[j] < x - pre
                j = bisect_left(primes, x - pre) - 1
                pre = x - primes[j]
            return True
    

    相关文章

      网友评论

          本文标题:LeetCode每日一题:质数运算

          本文链接:https://www.haomeiwen.com/subject/kpwzrdtx.html