2
2
3
3
## 题目描述
4
4
5
- 给你一根长度为 ` n ` 的绳子,请把绳子剪成整数长度的 ` m ` 段(m、n 都是整数,n>1 并且 m>1 ),每段绳子的长度记为 ` k[0],k[1]...k[m-1] ` 。请问 ` k[0]*k[1]*...*k[m-1] ` 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2 、3、3 的三段,此时得到的最大乘积是 18。
5
+ < p > 给你一根长度为 < code >n</ code > 的绳子,请把绳子剪成整数长度的 < code >m</ code > 段(m、n都是整数,n & gt ; 1并且m & gt ; 1 ),每段绳子的长度记为 < code > k[0],k[1]...k[m-1]</ code > 。请问 < code > k[0]*k[1]*...*k[m-1]</ code > 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2 、3、3的三段,此时得到的最大乘积是18。</ p >
6
6
7
- ** 示例 1:**
7
+ < p >< strong > 示例 1:</ strong ></ p >
8
8
9
- ```
10
- 输入: 2
11
- 输出: 1
12
- 解释: 2 = 1 + 1, 1 × 1 = 1
13
- ```
9
+ <pre ><strong >输入: </strong >2
10
+ <strong >输出: </strong >1
11
+ <strong >解释: </strong >2 = 1 + 1, 1 × ; 1 = 1</pre >
14
12
15
- ** 示例 2: **
13
+ < p >< strong >示例 & nbsp ; 2:</ strong ></ p >
16
14
17
- ```
18
- 输入: 10
19
- 输出: 36
20
- 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
21
- ```
15
+ < pre >< strong >输入: </ strong >10
16
+ < strong >输出: </ strong >36
17
+ < strong >解释: </ strong >10 = 3 + 3 + 4, 3 & times ;& nbsp ; 3 & times ;& nbsp ; 4 = 36</ pre >
18
+
19
+ < p >< strong >提示:</ strong ></ p >
22
20
23
- ** 提示:**
21
+ <ul >
22
+ <li><code>2 <= n <= 58</code></li>
23
+ </ul >
24
24
25
- - ` 2 <= n <= 58 `
25
+ < p >注意:本题与主站 343 题相同:< a href = " https://leetcode-cn.com/problems/integer-break/ " >https://leetcode-cn.com/problems/integer-break/</ a ></ p >
26
26
27
27
## 解法
28
28
@@ -37,28 +37,29 @@ class Solution:
37
37
def cuttingRope (self , n : int ) -> int :
38
38
if n < 4 :
39
39
return n - 1
40
- res = 1
40
+ ans = 1
41
41
while n > 4 :
42
- res *= 3
42
+ ans *= 3
43
43
n -= 3
44
- if n == 4 :
45
- return res << 2
46
- return res * n
44
+ ans *= n
45
+ return ans
47
46
```
48
47
49
48
### ** Java**
50
49
51
50
``` java
52
51
class Solution {
53
52
public int cuttingRope (int n ) {
54
- if (n < 4 ) return n - 1 ;
55
- int res = 1 ;
53
+ if (n < 4 ) {
54
+ return n - 1 ;
55
+ }
56
+ int ans = 1 ;
56
57
while (n > 4 ) {
57
- res *= 3 ;
58
+ ans *= 3 ;
58
59
n -= 3 ;
59
60
}
60
- if (n == 4 ) return res << 2 ;
61
- return res * n ;
61
+ ans *= n ;
62
+ return ans ;
62
63
}
63
64
}
64
65
```
@@ -71,40 +72,31 @@ class Solution {
71
72
* @return {number}
72
73
*/
73
74
var cuttingRope = function (n ) {
74
- // 数学方法
75
- if (n <= 3 ) return n - 1 ;
76
- let a = ~~ (n / 3 );
77
- let b = n % 3 ;
78
- if (b === 1 ) {
79
- return 3 ** (a - 1 ) * 2 * 2 ;
75
+ if (n < 4 ) return n - 1 ;
76
+ let ans = 1 ;
77
+ while (n > 4 ) {
78
+ ans *= 3 ;
79
+ n -= 3 ;
80
80
}
81
- if (b === 0 ) return 3 ** a;
82
- return 3 ** a * b;
83
- // dp 方法
84
- // let dp = new Array(n+1).fill(0)
85
- // dp[0] = 1
86
- // for(let i=1;i<n;i++) {
87
- // for(let j=i;j<=n;j++) {
88
- // dp[j] = Math.max(dp[j],dp[j-i] * i)
89
- // }
90
- // }
91
- // return dp[n]
81
+ ans *= n;
82
+ return ans;
92
83
};
93
84
```
94
85
95
86
### ** Go**
96
87
97
88
``` go
98
89
func cuttingRope (n int ) int {
99
- if n <= 3 {
90
+ if n < 4 {
100
91
return n - 1
101
92
}
102
- sum := 1
93
+ ans := 1
103
94
for n > 4 {
104
- sum *= 3
95
+ ans *= 3
105
96
n -= 3
106
97
}
107
- return sum * n
98
+ ans *= n
99
+ return ans
108
100
}
109
101
```
110
102
@@ -126,6 +118,23 @@ public:
126
118
};
127
119
```
128
120
121
+ ```cpp
122
+ class Solution {
123
+ public:
124
+ int cuttingRope(int n) {
125
+ if (n < 4) return n - 1;
126
+ int ans = 1;
127
+ while (n > 4)
128
+ {
129
+ ans *= 3;
130
+ n -= 3;
131
+ }
132
+ ans *= n;
133
+ return ans;
134
+ }
135
+ };
136
+ ```
137
+
129
138
### ** ...**
130
139
131
140
```
0 commit comments