GuilinDev

Lc1492

05 August 2008

1492. The kth Factor of n

给一个正整数n,寻找n的从小到大的所有整除的因子的第k大个,从1开始

枚举O(n)

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
    public int kthFactor(int n, int k) {
        for(int i = 1; i <= n; i++) {
            if(n % i == 0) {
                k--;
                if(k == 0) {
                    return i;
                }
            }
        }
        return -1;
    }
}

优化 O(logn)

如果 n 有一个因子 k,那么它必然有一个因子 n/k,这两个因子中至少有一个是小于等于 \sqrt n 的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
    public int kthFactor(int n, int k) {
        int count = 0, factor;
        for (factor = 1; factor * factor <= n; ++factor) {
            if (n % factor == 0) {
                ++count;
                if (count == k) {
                    return factor;
                }
            }
        }
        --factor;
        if (factor * factor == n) {
            --factor;
        }
        for (; factor > 0; --factor) {
            if (n % factor == 0) {
                ++count;
                if (count == k) {
                    return n / factor;
                }
            }
        }
        return -1;
    }
}