LeetCode 题解工作台

质数减法运算

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

category

5

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

中等 · 二分·搜索·答案·空间

bolt

答案摘要

我们先预处理得到 以内的所有质数,记录在数组 中。 对于数组 中的每个元素 ,我们需要找到一个质数 ,使得 p[j] \gt nums[i] - nums[i + 1],并且 尽可能小。如果找不到这样的质数,说明无法通过减法运算使得 严格递增,返回 `false`。如果找到了这样的质数,我们就将 减去 ,并继续处理下一个元素。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 二分·搜索·答案·空间 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个下标从 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 。

示例 2:

输入:nums = [6,8,11,12]
输出:true
解释:nums 从一开始就按严格递增顺序排序,因此不需要执行任何运算。

示例 3:

输入:nums = [5,8,3]
输出:false
解释:可以证明,执行运算无法使 nums 按严格递增顺序排序,因此答案是 false 。

 

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 1000
  • nums.length == n
lightbulb

解题思路

方法一:预处理质数 + 二分查找

我们先预处理得到 10001000 以内的所有质数,记录在数组 pp 中。

对于数组 numsnums 中的每个元素 nums[i]nums[i],我们需要找到一个质数 p[j]p[j],使得 p[j] \gt nums[i] - nums[i + 1],并且 p[j]p[j] 尽可能小。如果找不到这样的质数,说明无法通过减法运算使得 numsnums 严格递增,返回 false。如果找到了这样的质数,我们就将 nums[i]nums[i] 减去 p[j]p[j],并继续处理下一个元素。

如果 numsnums 中的所有元素都处理完了,说明可以通过减法运算使得 numsnums 严格递增,返回 true

时间复杂度 O(nlogn)O(n \log n),空间复杂度 O(n)O(n)。其中 nn 为数组 numsnums 的长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution:
    def primeSubOperation(self, nums: List[int]) -> bool:
        p = []
        for i in range(2, max(nums)):
            for j in p:
                if i % j == 0:
                    break
            else:
                p.append(i)

        n = len(nums)
        for i in range(n - 2, -1, -1):
            if nums[i] < nums[i + 1]:
                continue
            j = bisect_right(p, nums[i] - nums[i + 1])
            if j == len(p) or p[j] >= nums[i]:
                return False
            nums[i] -= p[j]
        return True
speed

复杂度分析

指标
时间O(n + m \log \log (m))
空间O(m)
psychology

面试官常问的追问

外企场景
  • question_mark

    Assess the candidate's understanding of prime number properties.

  • question_mark

    Look for knowledge in binary search optimization.

  • question_mark

    Check if the candidate is comfortable using greedy algorithms.

warning

常见陷阱

外企场景
  • error

    Forgetting to subtract the correct prime at each index.

  • error

    Not applying binary search efficiently, leading to unnecessary computation.

  • error

    Confusing prime subtraction with other array manipulation techniques.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Adjust the problem by limiting the available primes to smaller sets.

  • arrow_right_alt

    Alter the array length to test scalability and performance.

  • arrow_right_alt

    Change the problem to require the array to be non-decreasing instead of strictly increasing.

help

常见问题

外企场景

质数减法运算题解:二分·搜索·答案·空间 | LeetCode #2601 中等