Skip to content

Commit 0b3aa9d

Browse files
committedMar 16, 2023
feat: add solutions to lc problem: No.1362
No.1362.Closest Divisors
1 parent adbe83c commit 0b3aa9d

File tree

6 files changed

+209
-2
lines changed

6 files changed

+209
-2
lines changed
 

‎solution/1300-1399/1362.Closest Divisors/README.md

+78-1
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,99 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51+
**方法一:枚举**
52+
53+
我们设计一个函数 $f(x)$,该函数返回乘积等于 $x$ 的两个数,且这两个数的差的绝对值最小。我们可以从 $\sqrt{x}$ 开始枚举 $i$,如果 $x$ 能被 $i$ 整除,那么 $\frac{x}{i}$ 就是另一个因数,此时我们就找到了一个乘积等于 $x$ 的两个因数,我们将其返回即可。否则我们减小 $i$ 的值,继续枚举。
54+
55+
接下来,我们只需要分别计算 $f(num + 1)$ 和 $f(num + 2)$,然后比较两个函数的返回值,返回差的绝对值更小的那个即可。
56+
57+
时间复杂度 $O(\sqrt{num})$,空间复杂度 $O(1)$。其中 $num$ 是给定的整数。
58+
5159
<!-- tabs:start -->
5260

5361
### **Python3**
5462

5563
<!-- 这里可写当前语言的特殊实现逻辑 -->
5664

5765
```python
58-
66+
class Solution:
67+
def closestDivisors(self, num: int) -> List[int]:
68+
def f(x):
69+
for i in range(int(sqrt(x)), 0, -1):
70+
if x % i == 0:
71+
return [i, x // i]
72+
73+
a = f(num + 1)
74+
b = f(num + 2)
75+
return a if abs(a[0] - a[1]) < abs(b[0] - b[1]) else b
5976
```
6077

6178
### **Java**
6279

6380
<!-- 这里可写当前语言的特殊实现逻辑 -->
6481

6582
```java
83+
class Solution {
84+
public int[] closestDivisors(int num) {
85+
int[] a = f(num + 1);
86+
int[] b = f(num + 2);
87+
return Math.abs(a[0] - a[1]) < Math.abs(b[0] - b[1]) ? a : b;
88+
}
89+
90+
private int[] f(int x) {
91+
for (int i = (int) Math.sqrt(x);; --i) {
92+
if (x % i == 0) {
93+
return new int[] {i, x / i};
94+
}
95+
}
96+
}
97+
}
98+
```
99+
100+
### **C++**
101+
102+
```cpp
103+
class Solution {
104+
public:
105+
vector<int> closestDivisors(int num) {
106+
auto f = [](int x) {
107+
for (int i = sqrt(x);; --i) {
108+
if (x % i == 0) {
109+
return vector<int>{i, x / i};
110+
}
111+
}
112+
};
113+
vector<int> a = f(num + 1);
114+
vector<int> b = f(num + 2);
115+
return abs(a[0] - a[1]) < abs(b[0] - b[1]) ? a : b;
116+
}
117+
};
118+
```
66119
120+
### **Go**
121+
122+
```go
123+
func closestDivisors(num int) []int {
124+
f := func(x int) []int {
125+
for i := int(math.Sqrt(float64(x))); ; i-- {
126+
if x%i == 0 {
127+
return []int{i, x / i}
128+
}
129+
}
130+
}
131+
a, b := f(num+1), f(num+2)
132+
if abs(a[0]-a[1]) < abs(b[0]-b[1]) {
133+
return a
134+
}
135+
return b
136+
}
137+
138+
func abs(x int) int {
139+
if x < 0 {
140+
return -x
141+
}
142+
return x
143+
}
67144
```
68145

69146
### **...**

‎solution/1300-1399/1362.Closest Divisors/README_EN.md

+70-1
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,82 @@
4545
### **Python3**
4646

4747
```python
48-
48+
class Solution:
49+
def closestDivisors(self, num: int) -> List[int]:
50+
def f(x):
51+
for i in range(int(sqrt(x)), 0, -1):
52+
if x % i == 0:
53+
return [i, x // i]
54+
55+
a = f(num + 1)
56+
b = f(num + 2)
57+
return a if abs(a[0] - a[1]) < abs(b[0] - b[1]) else b
4958
```
5059

5160
### **Java**
5261

5362
```java
63+
class Solution {
64+
public int[] closestDivisors(int num) {
65+
int[] a = f(num + 1);
66+
int[] b = f(num + 2);
67+
return Math.abs(a[0] - a[1]) < Math.abs(b[0] - b[1]) ? a : b;
68+
}
69+
70+
private int[] f(int x) {
71+
for (int i = (int) Math.sqrt(x);; --i) {
72+
if (x % i == 0) {
73+
return new int[] {i, x / i};
74+
}
75+
}
76+
}
77+
}
78+
```
79+
80+
### **C++**
81+
82+
```cpp
83+
class Solution {
84+
public:
85+
vector<int> closestDivisors(int num) {
86+
auto f = [](int x) {
87+
for (int i = sqrt(x);; --i) {
88+
if (x % i == 0) {
89+
return vector<int>{i, x / i};
90+
}
91+
}
92+
};
93+
vector<int> a = f(num + 1);
94+
vector<int> b = f(num + 2);
95+
return abs(a[0] - a[1]) < abs(b[0] - b[1]) ? a : b;
96+
}
97+
};
98+
```
5499
100+
### **Go**
101+
102+
```go
103+
func closestDivisors(num int) []int {
104+
f := func(x int) []int {
105+
for i := int(math.Sqrt(float64(x))); ; i-- {
106+
if x%i == 0 {
107+
return []int{i, x / i}
108+
}
109+
}
110+
}
111+
a, b := f(num+1), f(num+2)
112+
if abs(a[0]-a[1]) < abs(b[0]-b[1]) {
113+
return a
114+
}
115+
return b
116+
}
117+
118+
func abs(x int) int {
119+
if x < 0 {
120+
return -x
121+
}
122+
return x
123+
}
55124
```
56125

57126
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public:
3+
vector<int> closestDivisors(int num) {
4+
auto f = [](int x) {
5+
for (int i = sqrt(x);; --i) {
6+
if (x % i == 0) {
7+
return vector<int>{i, x / i};
8+
}
9+
}
10+
};
11+
vector<int> a = f(num + 1);
12+
vector<int> b = f(num + 2);
13+
return abs(a[0] - a[1]) < abs(b[0] - b[1]) ? a : b;
14+
}
15+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
func closestDivisors(num int) []int {
2+
f := func(x int) []int {
3+
for i := int(math.Sqrt(float64(x))); ; i-- {
4+
if x%i == 0 {
5+
return []int{i, x / i}
6+
}
7+
}
8+
}
9+
a, b := f(num+1), f(num+2)
10+
if abs(a[0]-a[1]) < abs(b[0]-b[1]) {
11+
return a
12+
}
13+
return b
14+
}
15+
16+
func abs(x int) int {
17+
if x < 0 {
18+
return -x
19+
}
20+
return x
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public int[] closestDivisors(int num) {
3+
int[] a = f(num + 1);
4+
int[] b = f(num + 2);
5+
return Math.abs(a[0] - a[1]) < Math.abs(b[0] - b[1]) ? a : b;
6+
}
7+
8+
private int[] f(int x) {
9+
for (int i = (int) Math.sqrt(x);; --i) {
10+
if (x % i == 0) {
11+
return new int[] {i, x / i};
12+
}
13+
}
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution:
2+
def closestDivisors(self, num: int) -> List[int]:
3+
def f(x):
4+
for i in range(int(sqrt(x)), 0, -1):
5+
if x % i == 0:
6+
return [i, x // i]
7+
8+
a = f(num + 1)
9+
b = f(num + 2)
10+
return a if abs(a[0] - a[1]) < abs(b[0] - b[1]) else b

0 commit comments

Comments
 (0)