leetcode
leetcode 2001 ~ 2050
使数组可以被整除的最少删除次数

使数组可以被整除的最少删除次数

难度:

标签:

题目描述

代码结果

运行时间: 56 ms, 内存: 27.0 MB


/*
思路:
1. 使用 Java Stream API 计算 numsDivide 的最大公约数 gcd。
2. 过滤 nums 数组,找到第一个能整除 gcd 的元素。
3. 返回找到元素的索引或 -1。
*/
import java.util.Arrays;

public class Solution {
    public int minDeletions(int[] nums, int[] numsDivide) {
        // 计算 numsDivide 的最大公约数
        int gcd = Arrays.stream(numsDivide).reduce(this::gcd).getAsInt();

        // 排序 nums
        Arrays.sort(nums);

        // 找到第一个能整除 gcd 的元素
        return Arrays.stream(nums)
                     .filter(num -> gcd % num == 0)
                     .findFirst()
                     .map(num -> findIndex(nums, num))
                     .orElse(-1);
    }

    // 计算两个数的最大公约数
    private int gcd(int a, int b) {
        if (b == 0) return a;
        return gcd(b, a % b);
    }

    // 查找 num 在数组中的索引
    private int findIndex(int[] nums, int num) {
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == num) return i;
        }
        return -1;
    }
}

解释

方法:

本题解首先通过计算 numsDivide 中所有元素的最大公约数(GCD)x,从而确定需要的整除因子。然后在 nums 中查找可以被 x 整除的最小元素 y。如果找到这样的 y,则计算必须删除 nums 中所有小于 y 的元素才能使 y 成为 nums 中的最小元素。如果没有找到可以整除 x 的元素,则返回 -1。

时间复杂度:

O(n + k)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么首先计算 `numsDivide` 中所有元素的最大公约数(GCD)?这个操作在算法中起到了什么关键作用?
计算 `numsDivide` 中所有元素的最大公约数(GCD)是为了找出一个数字,该数字能被 `numsDivide` 中所有元素整除。这个步骤关键在于确定一个共同的整除因子,确保任何被这个 GCD 整除的数也必然能整除 `numsDivide` 中的每个元素。这样,我们只需要关注 `nums` 中能被这个 GCD 整除的数,从而简化问题范围和处理逻辑。
🦆
题解中提到找到可以被 GCD 整除的 `nums` 中的最小元素,为什么选择最小元素作为目标?
选择 `nums` 中可以被 GCD 整除的最小元素作为目标的原因是为了最小化需要删除的数字数量。如果我们以最小的符合条件的元素为基准,那么所有小于此元素的数字都需要被删除,以确保所有更大的、符合条件的数字仍然保留在数组中。这样可以确保删除操作尽可能少,达到题目要求的最少删除次数。
🦆
在题解中,如果 `nums` 中不存在可以被 GCD 整除的元素,直接返回 `-1`。这种情况是否意味着 `numsDivide` 的 GCD 太大,或者 `nums` 的元素范围不够广?
如果 `nums` 中不存在可以被 GCD 整除的元素,并直接返回 `-1`,这通常意味着 `nums` 中的元素与 `numsDivide` 的 GCD 不兼容,可能是因为 GCD 太大,或者 `nums` 中的元素范围不够广泛,无法包含任何可以被 GCD 整除的值。这种情况下,`nums` 数组无法调整来满足 `numsDivide` 中所有元素的整除要求。
🦆
题解中使用了 `min((v for v in nums if x % v == 0), default=0)` 来寻找符合条件的最小元素,请解释 `default=0` 在这里的具体作用是什么?
`default=0` 在这里的作用是提供一个默认值,用于处理当 `nums` 中没有任何元素能被 GCD 整除的情况。在这种情况下,`min` 函数没有元素可用来比较,如果没有 `default`,则会抛出异常。通过设置 `default=0`,我们可以安全地检测到没有符合条件的元素,并据此返回 `-1`,表示无法通过删除使 `nums` 满足条件。

相关问题