leetcode
leetcode 2651 ~ 2700
n 的第 k 个因子

n 的第 k 个因子

难度:

标签:

题目描述

You are given two positive integers n and k. A factor of an integer n is defined as an integer i where n % i == 0.

Consider a list of all factors of n sorted in ascending order, return the kth factor in this list or return -1 if n has less than k factors.

 

Example 1:

Input: n = 12, k = 3
Output: 3
Explanation: Factors list is [1, 2, 3, 4, 6, 12], the 3rd factor is 3.

Example 2:

Input: n = 7, k = 2
Output: 7
Explanation: Factors list is [1, 7], the 2nd factor is 7.

Example 3:

Input: n = 4, k = 4
Output: -1
Explanation: Factors list is [1, 2, 4], there is only 3 factors. We should return -1.

 

Constraints:

  • 1 <= k <= n <= 1000

 

Follow up:

Could you solve this problem in less than O(n) complexity?

代码结果

运行时间: 22 ms, 内存: 0.0 MB


/*
  * 思路:
  * 1. 使用IntStream从1到n遍历所有整数。
  * 2. 过滤出所有的因子,并将其收集到列表中。
  * 3. 判断列表的大小是否大于等于k,如果是,返回第k个因子,否则返回-1。
  */
import java.util.*;
import java.util.stream.*;

public class Solution {
    public int kthFactor(int n, int k) {
        List<Integer> factors = IntStream.rangeClosed(1, n)
                .filter(i -> n % i == 0)
                .boxed()
                .collect(Collectors.toList());
        return factors.size() >= k ? factors.get(k - 1) : -1;
    }
}

解释

方法:

此题解采用直接遍历的方法来查找第 k 个因子。算法从 1 遍历到 n,对于每一个 i,检查是否能整除 n(即 n % i == 0)。如果可以整除,说明 i 是 n 的一个因子,此时将 k 减 1。当 k 减至 0 时,说明已找到第 k 个因子,返回当前的 i 值。如果遍历结束后 k 仍然大于 0,说明因子的数量不足 k 个,返回 -1。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
在算法中,为何选择直接遍历从 1 到 n 来查找因子,而不使用其他可能更高效的方法(如只遍历到 sqrt(n))?
直接遍历从 1 到 n 来查找因子是一种简单明了的方法,易于理解和实现。尽管遍历到 sqrt(n) 并检查 n/i 是否也是因子可以更高效地找到所有因子,但在寻找第 k 个具体的因子时,这种方法需要额外的逻辑来正确地维护因子的顺序,因为因子对 (i, n/i) 产生的两个因子在顺序上可能不连续。此外,遍历到 n 保证了因子检查的顺序性,直接符合查找第 k 个因子的需求。
🦆
在代码中,如果找到一个因子 i ,是否还可以立即确定 n/i 也是一个因子,从而可能减少遍历的次数?
是的,如果在遍历中发现 i 是 n 的因子,可以确定 n/i 也是 n 的因子。但在查找第 k 个因子时,直接使用这种方法可能会引入顺序处理的复杂性,因为你需要同时跟踪从小到大和从大到小的因子。例如,如果 n = 36,i = 6,则 n/i = 6,这在因子序列中只应计数一次。如果 n = 28,i = 4,则 n/i = 7,这两个因子在顺序上是连续的,但这种情况并不总是成立。因此,这种优化虽然可以减少遍历次数,但需要小心处理因子的顺序和重复计数问题。
🦆
算法在碰到顺序的第 k 个因子时直接返回,但如果 k 大于 n 的因子总数,会返回 -1。这里是否进行了所有必要的检查,以确保算法的正确性和效率?
算法通过遍历每个数字并检查是否为 n 的因子,确保了正确性。如果 k 递减到 0,则返回当前的因子;如果遍历结束后 k 仍大于 0,返回 -1 表示因子数量不足 k 个。此方法确保了算法的正确性。然而,关于效率,虽然遍历到 n 是简单直接的,但它不是最优的,特别是对于大的 n 值。遍历到 sqrt(n) 并适当处理因子的顺序计数可能更加高效,尤其是当 k 较小时。

相关问题