1492 n 的第 k 个因子(暴力破解、分析)

1. 问题描述:

给你两个正整数 n 和 k 。如果正整数 i 满足 n % i == 0 ,那么我们就说正整数 i 是整数 n 的因子。考虑整数 n 的所有因子,将它们 升序排列 。请你返回第 k 个因子。如果 n 的因子数少于 k ,请你返回 -1

示例 1:

输入:n = 12, k = 3
输出:3
解释:因子列表包括 [1, 2, 3, 4, 6, 12],第 3 个因子是 3

示例 2:

输入:n = 7, k = 2
输出:7
解释:因子列表包括 [1, 7] ,第 2 个因子是 7 。

示例 3:

输入:n = 4, k = 4
输出:-1
解释:因子列表包括 [1, 2, 4] ,只有 3 个因子,所以我们应该返回 -1

示例 4:

输入:n = 1, k = 1
输出:1
解释:因子列表包括 [1] ,第 1 个因子为 1 

示例 5:

输入:n = 1000, k = 3
输出:4
解释:因子列表包括 [1, 2, 4, 5, 8, 10, 20, 25, 40, 50, 100, 125, 200, 250, 500, 1000] 

提示:

  • 1 <= k <= n <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/the-kth-factor-of-n

2. 思路分析:

    第一个比较容易想到的是一一枚举1到n这个范围内的因子,并且在枚举的时候对其计数,发现等于了k那么返回这个因子即可,第二种做法是官方提供的思路,其中一个因子是小于等于根号n的,所以我们首先需要一个循环来找出所有小于等于根号n的因子并且进行计数看是否等于了k,假如在这个范围之内没有找到,那么第k个因为可能是大于根号n的那么使用循环进行倒着来进行计算,这样就可以保持因子的顺序了,其实这个思路还是比较好理解的

3. 代码如下:

class Solution:
    def kthFactor(self, n: int, k: int) -> int:
        count = 0
        for i in range(1, n + 1):
            if n % i == 0:
                count += 1
            if k == count: return i
        return -1
class Solution:
    # 只需要遍历根号n的范围内的数字即可然后从后面倒数着来计算即可
    def kthFactor(self, n: int, k: int) -> int:
        factor, count = 1, 0
        while factor * factor <= n:
            if n % factor == 0:
               count += 1
            if count == k: return factor
            factor += 1
        factor -= 1
        # 平方的数字只需要计算一次即可
        if factor * factor == n: factor -= 1
        # 第k个因为可能超过了根号n的所以要倒着计算
        while factor > 0:
            if n % factor == 0:
                count += 1
            if count == k: return n // factor
            factor -= 1
        return -1

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/107458177