LeetCode 2601. Prime Subtraction Operation

34 阅读1分钟

🔗 leetcode.com/problems/pr…

题目

  • 给一个数组,针对其中的每一个数字 num[i],可以不动,也可以减去一个素数 p,要求是这个素数小于 num[i];
  • 判断是否存在严格升序的数组;

思路

  • 按顺序调整 num[i],最优的 p,是满足 p< num[i] && num[i] - p > num[i-1] 的最大值;
  • HINT,1 不是素数,2是素数;

代码

class Solution {
public:
    bool is_prime(int num) {
        int tmp = sqrt(num);
        for (int i = 2; i <= tmp; i++) {
            if (num % i == 0) return false;
        }
        return true;
    }
    bool primeSubOperation(vector<int>& nums) {
        // setup
        vector<bool> prime(1010);
        prime[1] = false;
        prime[2] = true;
        for (int i = 3; i < 1001; i++) {
            prime[i] = is_prime(i);
        }

        // adjust nums
        int pre = 0;
        for (int i = 0; i < nums.size(); i++) {
            int num = nums[i];
            for (int j = num-1; j>1; j--) {
                if (!prime[j]) continue;
                if (num -j > pre) {
                    nums[i] = num -j;
                    break;
                }
            }
            pre = nums[i];
            //printf("num %d ", nums[i]);
        }

        // check
        for (int i = 1; i < nums.size(); i++) {
            if (nums[i] <= nums[i-1]) return false;
        }
        return true;
     
    }
};