Skip to content

Commit 01272f7

Browse files
authored
Create the-kth-factor-of-n.cpp
1 parent e014dc8 commit 01272f7

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

C++/the-kth-factor-of-n.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Time: O(sqrt(n))
2+
// Space: O(1)
3+
4+
class Solution {
5+
public:
6+
int kthFactor(int n, int k) {
7+
const auto& [mid, count] = kthFactor_(n);
8+
int total = 2 * count - (mid * mid == n);
9+
if (k > total) {
10+
return -1;
11+
}
12+
int result = kthFactor_(n, (k <= count) ? k : total - (k - 1)).first;
13+
return (k <= count) ? result : n / result;
14+
}
15+
16+
private:
17+
pair<int, int> kthFactor_(int n, int k = 0) {
18+
int mid = -1;
19+
for (int i = 1; i * i <= n; ++i) {
20+
if (n % i) {
21+
continue;
22+
}
23+
mid = i;
24+
if (!--k) {
25+
break;
26+
}
27+
}
28+
return {mid, -k};
29+
}
30+
};
31+
32+
// Time: O(sqrt(n))
33+
// Space: O(sqrt(n))
34+
class Solution2 {
35+
public:
36+
int kthFactor(int n, int k) {
37+
vector<int> result;
38+
for (int i = 1; i * i <= n; ++i) {
39+
if (n % i) {
40+
continue;
41+
}
42+
if (i * i != n) {
43+
result.emplace_back(i);
44+
}
45+
if (!--k) {
46+
return i;
47+
}
48+
}
49+
return (k > result.size()) ? -1 : n / result[result.size() - k];
50+
}
51+
};

0 commit comments

Comments
 (0)