File tree 6 files changed +209
-2
lines changed
solution/1300-1399/1362.Closest Divisors
6 files changed +209
-2
lines changed Original file line number Diff line number Diff line change 48
48
49
49
<!-- 这里可写通用的实现逻辑 -->
50
50
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
+
51
59
<!-- tabs:start -->
52
60
53
61
### ** Python3**
54
62
55
63
<!-- 这里可写当前语言的特殊实现逻辑 -->
56
64
57
65
``` 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
59
76
```
60
77
61
78
### ** Java**
62
79
63
80
<!-- 这里可写当前语言的特殊实现逻辑 -->
64
81
65
82
``` 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
+ ```
66
119
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
+ }
67
144
```
68
145
69
146
### ** ...**
Original file line number Diff line number Diff line change 45
45
### ** Python3**
46
46
47
47
``` 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
49
58
```
50
59
51
60
### ** Java**
52
61
53
62
``` 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
+ ```
54
99
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
+ }
55
124
```
56
125
57
126
### ** ...**
Original file line number Diff line number Diff line change
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 number Diff line number Diff line change
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 number Diff line number Diff line change
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 number Diff line number Diff line change
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
You can’t perform that action at this time.
0 commit comments