Skip to content

Commit 3fc9c24

Browse files
committed
feat: add solutions to lc problem: No.1739
No.1739.Building Boxes
1 parent 8bd8299 commit 3fc9c24

File tree

6 files changed

+229
-2
lines changed

6 files changed

+229
-2
lines changed

solution/1700-1799/1739.Building Boxes/README.md

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,22 +61,107 @@
6161

6262
<!-- 这里可写通用的实现逻辑 -->
6363

64+
**方法一:数学规律**
65+
66+
根据题目描述,层数最高的盒子需要放在墙角,并且盒子的摆放呈阶梯状,这样可以使得接触地面的盒子数量最少。
67+
68+
假设盒子摆放 $k$ 层,从上到下,每一层如果摆满,那么个数分别是 $1, 1+2, 1+2+3, \cdots, 1+2+\cdots+k$。
69+
70+
如果此时盒子还有剩余,那么可以从最低一层继续摆放,假设摆放 $i$ 个,那么累计可摆放的盒子个数为 $1+2+\cdots+i$。
71+
72+
时间复杂度 $O(\sqrt{n})$,空间复杂度 $O(1)$。其中 $n$ 为题目给定的盒子数量。
73+
6474
<!-- tabs:start -->
6575

6676
### **Python3**
6777

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

7080
```python
71-
81+
class Solution:
82+
def minimumBoxes(self, n: int) -> int:
83+
s, k = 0, 1
84+
while s + k * (k + 1) // 2 <= n:
85+
s += k * (k + 1) // 2
86+
k += 1
87+
k -= 1
88+
ans = k * (k + 1) // 2
89+
k = 1
90+
while s < n:
91+
ans += 1
92+
s += k
93+
k += 1
94+
return ans
7295
```
7396

7497
### **Java**
7598

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

78101
```java
102+
class Solution {
103+
public int minimumBoxes(int n) {
104+
int s = 0, k = 1;
105+
while (s + k * (k + 1) / 2 <= n) {
106+
s += k * (k + 1) / 2;
107+
++k;
108+
}
109+
--k;
110+
int ans = k * (k + 1) / 2;
111+
k = 1;
112+
while (s < n) {
113+
++ans;
114+
s += k;
115+
++k;
116+
}
117+
return ans;
118+
}
119+
}
120+
```
121+
122+
### **C++**
123+
124+
```cpp
125+
class Solution {
126+
public:
127+
int minimumBoxes(int n) {
128+
int s = 0, k = 1;
129+
while (s + k * (k + 1) / 2 <= n) {
130+
s += k * (k + 1) / 2;
131+
++k;
132+
}
133+
--k;
134+
int ans = k * (k + 1) / 2;
135+
k = 1;
136+
while (s < n) {
137+
++ans;
138+
s += k;
139+
++k;
140+
}
141+
return ans;
142+
}
143+
};
144+
```
79145
146+
### **Go**
147+
148+
```go
149+
func minimumBoxes(n int) int {
150+
s, k := 0, 1
151+
for s+k*(k+1)/2 <= n {
152+
s += k * (k + 1) / 2
153+
k++
154+
}
155+
k--
156+
ans := k * (k + 1) / 2
157+
k = 1
158+
for s < n {
159+
ans++
160+
s += k
161+
k++
162+
}
163+
return ans
164+
}
80165
```
81166

82167
### **...**

solution/1700-1799/1739.Building Boxes/README_EN.md

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,88 @@ These boxes are placed in the corner of the room, where the corner is on the bac
6060
### **Python3**
6161

6262
```python
63-
63+
class Solution:
64+
def minimumBoxes(self, n: int) -> int:
65+
s, k = 0, 1
66+
while s + k * (k + 1) // 2 <= n:
67+
s += k * (k + 1) // 2
68+
k += 1
69+
k -= 1
70+
ans = k * (k + 1) // 2
71+
k = 1
72+
while s < n:
73+
ans += 1
74+
s += k
75+
k += 1
76+
return ans
6477
```
6578

6679
### **Java**
6780

6881
```java
82+
class Solution {
83+
public int minimumBoxes(int n) {
84+
int s = 0, k = 1;
85+
while (s + k * (k + 1) / 2 <= n) {
86+
s += k * (k + 1) / 2;
87+
++k;
88+
}
89+
--k;
90+
int ans = k * (k + 1) / 2;
91+
k = 1;
92+
while (s < n) {
93+
++ans;
94+
s += k;
95+
++k;
96+
}
97+
return ans;
98+
}
99+
}
100+
```
101+
102+
### **C++**
103+
104+
```cpp
105+
class Solution {
106+
public:
107+
int minimumBoxes(int n) {
108+
int s = 0, k = 1;
109+
while (s + k * (k + 1) / 2 <= n) {
110+
s += k * (k + 1) / 2;
111+
++k;
112+
}
113+
--k;
114+
int ans = k * (k + 1) / 2;
115+
k = 1;
116+
while (s < n) {
117+
++ans;
118+
s += k;
119+
++k;
120+
}
121+
return ans;
122+
}
123+
};
124+
```
69125
126+
### **Go**
127+
128+
```go
129+
func minimumBoxes(n int) int {
130+
s, k := 0, 1
131+
for s+k*(k+1)/2 <= n {
132+
s += k * (k + 1) / 2
133+
k++
134+
}
135+
k--
136+
ans := k * (k + 1) / 2
137+
k = 1
138+
for s < n {
139+
ans++
140+
s += k
141+
k++
142+
}
143+
return ans
144+
}
70145
```
71146

72147
### **...**
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public:
3+
int minimumBoxes(int n) {
4+
int s = 0, k = 1;
5+
while (s + k * (k + 1) / 2 <= n) {
6+
s += k * (k + 1) / 2;
7+
++k;
8+
}
9+
--k;
10+
int ans = k * (k + 1) / 2;
11+
k = 1;
12+
while (s < n) {
13+
++ans;
14+
s += k;
15+
++k;
16+
}
17+
return ans;
18+
}
19+
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
func minimumBoxes(n int) int {
2+
s, k := 0, 1
3+
for s+k*(k+1)/2 <= n {
4+
s += k * (k + 1) / 2
5+
k++
6+
}
7+
k--
8+
ans := k * (k + 1) / 2
9+
k = 1
10+
for s < n {
11+
ans++
12+
s += k
13+
k++
14+
}
15+
return ans
16+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution {
2+
public int minimumBoxes(int n) {
3+
int s = 0, k = 1;
4+
while (s + k * (k + 1) / 2 <= n) {
5+
s += k * (k + 1) / 2;
6+
++k;
7+
}
8+
--k;
9+
int ans = k * (k + 1) / 2;
10+
k = 1;
11+
while (s < n) {
12+
++ans;
13+
s += k;
14+
++k;
15+
}
16+
return ans;
17+
}
18+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def minimumBoxes(self, n: int) -> int:
3+
s, k = 0, 1
4+
while s + k * (k + 1) // 2 <= n:
5+
s += k * (k + 1) // 2
6+
k += 1
7+
k -= 1
8+
ans = k * (k + 1) // 2
9+
k = 1
10+
while s < n:
11+
ans += 1
12+
s += k
13+
k += 1
14+
return ans

0 commit comments

Comments
 (0)