leetcode
leetcode 1751 ~ 1800
最小的仅由两个数组成的倍数

最小的仅由两个数组成的倍数

难度:

标签:

题目描述

代码结果

运行时间: 36 ms, 内存: 16.2 MB


/*
 * Leetcode 1999: 最小的仅由两个数组成的倍数
 * 题目思路:
 * 给定两个数组A和B,找到一个最小的正整数X,它仅包含A和B中的元素并且是两个数组元素的倍数。
 * 我们可以使用Java Stream API来简化遍历和检查。
 */

import java.util.stream.IntStream;

public class Solution {
    public int smallestMultiple(int[] A, int[] B) {
        return IntStream.iterate(1, i -> i + 1)
                         .filter(i -> isMultipleOfArrays(i, A) && isMultipleOfArrays(i, B))
                         .findFirst()
                         .getAsInt();
    }
    
    private boolean isMultipleOfArrays(int num, int[] arr) {
        return IntStream.of(arr).anyMatch(n -> num % n == 0);
    }
}

解释

方法:

题解通过构造并检查整数来解决问题,整数由指定的两个数字digit1和digit2组成。首先,代码处理了特殊情况,当两个数字都为0时,返回-1,因为0不能被任何正数整除。接着,处理digit1和digit2相等的情况,从最小的数开始,逐步构造更大的数,直到找到一个大于k且能被k整除的数,或者超出32位整数的范围。如果digit1不等于digit2,代码首先确保digit1小于digit2以简化后续逻辑,然后使用广度优先搜索(BFS)策略从较小的数字开始,逐步构造可能的整数,并检查是否满足条件。通过队列来管理待检查的数字,对每个数字,尝试添加digit1和digit2作为新的最低位,从而构造新的数字,并检查是否满足条件。这个过程持续进行,直到找到合适的数字或确定无解。

时间复杂度:

O(10^9) in the worst case scenario

空间复杂度:

O(10^9) in the worst case scenario

代码细节讲解

🦆
为什么在处理两个数字都为0的特殊情况时,直接返回-1而不是尝试其他解决方案?
当两个数字都为0时,任何构造的数字都将只包含0(例如00, 000, 0000等),这些数字都是0。0不能被任何正数整除,因此不可能存在一个由两个0组成的正整数来满足能够被正整数k整除的条件。因此,这种情况下直接返回-1是因为继续搜索不会产生有效的结果。
🦆
在digit1和digit2相等的情况下,为什么选择通过连续构造更大的数的方式来寻找解,这种方法是否可能导致无法找到存在的解?
当digit1和digit2相等时,任何可能的数字都会由相同的数字重复组成,如11, 111, 1111等。这种方法首先尝试最小的数,如单个数字,然后逐步增大,检查每个数字是否大于k并能被k整除。这种方法可能导致处理时间较长,但理论上,如果存在一个解,则最终可以找到,因为数字会不断增长直到找到一个符合条件的数或超出32位整数的范围。不存在找不到解的情况,除非所有可能的数字都已经超出32位整数的范围,这时返回-1。
🦆
在数字digit1不等于digit2时,为什么要确保digit1小于digit2,这一步骤对算法的正确性或效率有何影响?
确保digit1小于digit2可以简化算法的逻辑处理,因为这样可以始终从较小的数字开始构造新的数字。这有助于避免在数字构造过程中的重复和不必要的混乱。例如,在进行广度优先搜索(BFS)时,始终从较小的数字开始可以确保搜索路径是系统性的,逐渐增加数字的大小,并且能够更快地遍历所有可能的组合。这种做法提高了算法的效率和易于管理,尤其是在使用队列进行数字构造的过程中。

相关问题