Skip to content

Commit b1db680

Browse files
committed
feat: add solutions to lcof problems: No.14.1,14.2
1 parent 85cd222 commit b1db680

File tree

15 files changed

+359
-192
lines changed

15 files changed

+359
-192
lines changed

lcof/面试题14- I. 剪绳子/README.md

+151-73
Original file line numberDiff line numberDiff line change
@@ -26,77 +26,81 @@
2626

2727
## 解法
2828

29-
尽可能将绳子以长度 3 等分剪为多段时,乘积最大。
29+
**方法一:动态规划**
30+
31+
我们定义 $dp[i]$ 表示正整数 $n$ 能获得的最大乘积,初始化 $dp[1] = 1$。答案即为 $dp[n]$。
32+
33+
状态转移方程为:
34+
35+
$$
36+
dp[i] = max(dp[i], dp[i - j] \times j, (i - j) \times j) \quad (j \in [0, i))
37+
$$
38+
39+
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为正整数 $n$。
40+
41+
**方法二:数学**
42+
43+
当 $n \lt 4$ 时,$n$ 不能拆分成至少两个正整数的和,因此 $n - 1$ 是最大乘积。当 $n \ge 4$ 时,我们尽可能多地拆分 $3$,当剩下的最后一段为 $4$ 时,我们将其拆分为 $2 + 2$,这样乘积最大。
44+
45+
时间复杂度 $O(1)$,空间复杂度 $O(1)$。
3046

3147
<!-- tabs:start -->
3248

3349
### **Python3**
3450

51+
```python
52+
class Solution:
53+
def cuttingRope(self, n: int) -> int:
54+
dp = [1] * (n + 1)
55+
for i in range(2, n + 1):
56+
for j in range(1, i):
57+
dp[i] = max(dp[i], dp[i - j] * j, (i - j) * j)
58+
return dp[n]
59+
```
60+
3561
```python
3662
class Solution:
3763
def cuttingRope(self, n: int) -> int:
3864
if n < 4:
3965
return n - 1
40-
ans = 1
41-
while n > 4:
42-
ans *= 3
43-
n -= 3
44-
ans *= n
45-
return ans
66+
if n % 3 == 0:
67+
return pow(3, n // 3)
68+
if n % 3 == 1:
69+
return pow(3, n // 3 - 1) * 4
70+
return pow(3, n // 3) * 2
4671
```
4772

4873
### **Java**
4974

5075
```java
5176
class Solution {
5277
public int cuttingRope(int n) {
53-
if (n < 4) {
54-
return n - 1;
55-
}
56-
int ans = 1;
57-
while (n > 4) {
58-
ans *= 3;
59-
n -= 3;
78+
int[] dp = new int[n + 1];
79+
dp[1] = 1;
80+
for (int i = 2; i <= n; ++i) {
81+
for (int j = 1; j < i; ++j) {
82+
dp[i] = Math.max(Math.max(dp[i], dp[i - j] * j), (i - j) * j);
83+
}
6084
}
61-
ans *= n;
62-
return ans;
85+
return dp[n];
6386
}
6487
}
6588
```
6689

67-
### **JavaScript**
68-
69-
```js
70-
/**
71-
* @param {number} n
72-
* @return {number}
73-
*/
74-
var cuttingRope = function (n) {
75-
if (n < 4) return n - 1;
76-
let ans = 1;
77-
while (n > 4) {
78-
ans *= 3;
79-
n -= 3;
90+
```java
91+
class Solution {
92+
public int cuttingRope(int n) {
93+
if (n < 4) {
94+
return n - 1;
95+
}
96+
if (n % 3 == 0) {
97+
return (int) Math.pow(3, n / 3);
98+
}
99+
if (n % 3 == 1) {
100+
return (int) Math.pow(3, n / 3 - 1) * 4;
101+
}
102+
return (int) Math.pow(3, n / 3) * 2;
80103
}
81-
ans *= n;
82-
return ans;
83-
};
84-
```
85-
86-
### **Go**
87-
88-
```go
89-
func cuttingRope(n int) int {
90-
if n < 4 {
91-
return n - 1
92-
}
93-
ans := 1
94-
for n > 4 {
95-
ans *= 3
96-
n -= 3
97-
}
98-
ans *= n
99-
return ans
100104
}
101105
```
102106

@@ -107,10 +111,10 @@ class Solution {
107111
public:
108112
int cuttingRope(int n) {
109113
vector<int> dp(n + 1);
110-
dp[0] = 1;
111-
for (int i = 1; i < n; ++i) {
112-
for (int j = i; j <= n; ++j) {
113-
dp[j] = max(dp[j], dp[j - i] * i);
114+
dp[1] = 1;
115+
for (int i = 2; i <= n; ++i) {
116+
for (int j = 1; j < i; ++j) {
117+
dp[i] = max(max(dp[i], dp[i - j] * j), (i - j) * j);
114118
}
115119
}
116120
return dp[n];
@@ -122,33 +126,107 @@ public:
122126
class Solution {
123127
public:
124128
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;
129+
if (n < 4) {
130+
return n - 1;
131131
}
132-
ans *= n;
133-
return ans;
132+
if (n % 3 == 0) {
133+
return pow(3, n / 3);
134+
}
135+
if (n % 3 == 1) {
136+
return pow(3, n / 3 - 1) * 4;
137+
}
138+
return pow(3, n / 3) * 2;
139+
}
140+
};
141+
```
142+
143+
### **Go**
144+
145+
```go
146+
func cuttingRope(n int) int {
147+
dp := make([]int, n+1)
148+
dp[1] = 1
149+
for i := 2; i <= n; i++ {
150+
for j := 1; j < i; j++ {
151+
dp[i] = max(max(dp[i], dp[i-j]*j), (i-j)*j)
152+
}
153+
}
154+
return dp[n]
155+
}
156+
157+
func max(a, b int) int {
158+
if a > b {
159+
return a
160+
}
161+
return b
162+
}
163+
```
164+
165+
```go
166+
func cuttingRope(n int) int {
167+
if n < 4 {
168+
return n - 1
169+
}
170+
if n%3 == 0 {
171+
return int(math.Pow(3, float64(n/3)))
172+
}
173+
if n%3 == 1 {
174+
return int(math.Pow(3, float64(n/3-1))) * 4
175+
}
176+
return int(math.Pow(3, float64(n/3))) * 2
177+
}
178+
```
179+
180+
### **JavaScript**
181+
182+
```js
183+
/**
184+
* @param {number} n
185+
* @return {number}
186+
*/
187+
var cuttingRope = function (n) {
188+
if (n < 4) {
189+
return n - 1;
134190
}
191+
const m = Math.floor(n / 3);
192+
if (n % 3 == 0) {
193+
return 3 ** m;
194+
}
195+
if (n % 3 == 1) {
196+
return 3 ** (m - 1) * 4;
197+
}
198+
return 3 ** m * 2;
135199
};
136200
```
137201

202+
### **TypeScript**
203+
204+
```ts
205+
function cuttingRope(n: number): number {
206+
if (n < 4) {
207+
return n - 1;
208+
}
209+
const m = Math.floor(n / 3);
210+
if (n % 3 == 0) {
211+
return 3 ** m;
212+
}
213+
if (n % 3 == 1) {
214+
return 3 ** (m - 1) * 4;
215+
}
216+
return 3 ** m * 2;
217+
}
218+
```
219+
138220
### **Rust**
139221

140222
```rust
141223
impl Solution {
142-
pub fn cutting_rope(mut n: i32) -> i32 {
224+
pub fn cutting_rope(n: i32) -> i32 {
143225
if n < 4 {
144226
return n - 1;
145227
}
146-
let mut res = 1;
147-
while n > 4 {
148-
res *= 3;
149-
n -= 3;
150-
}
151-
res * n
228+
let count = (n - 2) / 3;
229+
3i32.pow(count as u32) * (n - count * 3)
152230
}
153231
}
154232
```
@@ -161,13 +239,13 @@ public class Solution {
161239
if (n < 4) {
162240
return n - 1;
163241
}
164-
int ans = 1;
165-
while (n > 4) {
166-
ans *= 3;
167-
n -= 3;
242+
if (n % 3 == 0) {
243+
return (int) Math.Pow(3, n / 3);
244+
}
245+
if (n % 3 == 1) {
246+
return (int) Math.Pow(3, n / 3 - 1) * 4;
168247
}
169-
ans *= n;
170-
return ans;
248+
return (int) Math.Pow(3, n / 3) * 2;
171249
}
172250
}
173251
```
+10-8
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
class Solution {
22
public:
33
int cuttingRope(int n) {
4-
vector<int> dp(n + 1);
5-
dp[0] = 1;
6-
for (int i = 1; i < n; ++i) {
7-
for (int j = i; j <= n; ++j) {
8-
dp[j] = max(dp[j], dp[j - i] * i);
9-
}
4+
if (n < 4) {
5+
return n - 1;
106
}
11-
return dp[n];
7+
if (n % 3 == 0) {
8+
return pow(3, n / 3);
9+
}
10+
if (n % 3 == 1) {
11+
return pow(3, n / 3 - 1) * 4;
12+
}
13+
return pow(3, n / 3) * 2;
1214
}
13-
};
15+
};

lcof/面试题14- I. 剪绳子/Solution.cs

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ public int CuttingRope(int n) {
33
if (n < 4) {
44
return n - 1;
55
}
6-
int ans = 1;
7-
while (n > 4) {
8-
ans *= 3;
9-
n -= 3;
6+
if (n % 3 == 0) {
7+
return (int) Math.Pow(3, n / 3);
108
}
11-
ans *= n;
12-
return ans;
9+
if (n % 3 == 1) {
10+
return (int) Math.Pow(3, n / 3 - 1) * 4;
11+
}
12+
return (int) Math.Pow(3, n / 3) * 2;
1313
}
1414
}

lcof/面试题14- I. 剪绳子/Solution.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ func cuttingRope(n int) int {
22
if n < 4 {
33
return n - 1
44
}
5-
ans := 1
6-
for n > 4 {
7-
ans *= 3
8-
n -= 3
5+
if n%3 == 0 {
6+
return int(math.Pow(3, float64(n/3)))
97
}
10-
ans *= n
11-
return ans
8+
if n%3 == 1 {
9+
return int(math.Pow(3, float64(n/3-1))) * 4
10+
}
11+
return int(math.Pow(3, float64(n/3))) * 2
1212
}

lcof/面试题14- I. 剪绳子/Solution.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ public int cuttingRope(int n) {
33
if (n < 4) {
44
return n - 1;
55
}
6-
int ans = 1;
7-
while (n > 4) {
8-
ans *= 3;
9-
n -= 3;
6+
if (n % 3 == 0) {
7+
return (int) Math.pow(3, n / 3);
108
}
11-
ans *= n;
12-
return ans;
9+
if (n % 3 == 1) {
10+
return (int) Math.pow(3, n / 3 - 1) * 4;
11+
}
12+
return (int) Math.pow(3, n / 3) * 2;
1313
}
1414
}

lcof/面试题14- I. 剪绳子/Solution.js

+10-7
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33
* @return {number}
44
*/
55
var cuttingRope = function (n) {
6-
if (n < 4) return n - 1;
7-
let ans = 1;
8-
while (n > 4) {
9-
ans *= 3;
10-
n -= 3;
6+
if (n < 4) {
7+
return n - 1;
118
}
12-
ans *= n;
13-
return ans;
9+
const m = Math.floor(n / 3);
10+
if (n % 3 == 0) {
11+
return 3 ** m;
12+
}
13+
if (n % 3 == 1) {
14+
return 3 ** (m - 1) * 4;
15+
}
16+
return 3 ** m * 2;
1417
};

0 commit comments

Comments
 (0)