Skip to content

Commit 13f95a5

Browse files
committed
feat: add solutions to lc problem: No.1866
No.1866.Number of Ways to Rearrange Sticks With K Sticks Visible
1 parent 8042235 commit 13f95a5

File tree

8 files changed

+319
-7
lines changed

8 files changed

+319
-7
lines changed
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
class Solution:
2-
def profitableSchemes(self, n: int, minProfit: int, group: List[int], profit: List[int]) -> int:
2+
def profitableSchemes(
3+
self, n: int, minProfit: int, group: List[int], profit: List[int]
4+
) -> int:
35
mod = 10**9 + 7
46
m = len(group)
5-
f = [[[0] * (minProfit + 1) for _ in range(n + 1)]
6-
for _ in range(m + 1)]
7+
f = [[[0] * (minProfit + 1) for _ in range(n + 1)] for _ in range(m + 1)]
78
for j in range(n + 1):
89
f[0][j][0] = 1
910
for i, (x, p) in enumerate(zip(group, profit), 1):
1011
for j in range(n + 1):
1112
for k in range(minProfit + 1):
1213
f[i][j][k] = f[i - 1][j][k]
1314
if j >= x:
14-
f[i][j][k] = (f[i][j][k] + f[i - 1]
15-
[j - x][max(0, k - p)]) % mod
15+
f[i][j][k] = (f[i][j][k] + f[i - 1][j - x][max(0, k - p)]) % mod
1616
return f[m][n][minProfit]

solution/1000-1099/1012.Numbers With Repeated Digits/Solution.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ def dfs(pos: int, mask: int, lead: bool, limit: bool) -> int:
1515
if i == 0 and lead:
1616
ans += dfs(pos - 1, mask, lead, limit and i == up)
1717
else:
18-
ans += dfs(pos - 1, mask | 1 << i,
19-
False, limit and i == up)
18+
ans += dfs(pos - 1, mask | 1 << i, False, limit and i == up)
2019
return ans
2120

2221
nums = []

solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/README.md

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,162 @@
5252

5353
<!-- 这里可写通用的实现逻辑 -->
5454

55+
**方法一:动态规划**
56+
57+
我们定义 $f[i][j]$ 表示长度为 $i$ 的排列中,恰有 $j$ 根木棍可以看到的排列数目。初始时 $f[0][0]=1$,其余 $f[i][j]=0$。答案为 $f[n][k]$。
58+
59+
考虑最后一根木棍是否可以看到,如果可以看到,那么它一定是最长的,那么它的前面有 $i - 1$ 根木棍,恰有 $j - 1$ 根木棍可以看到,即 $f[i - 1][j - 1]$;如果最后一根木棍不可以看到,那么它可以是除了最长的木棍之外的任意一根,那么它的前面有 $i - 1$ 根木棍,恰有 $j$ 根木棍可以看到,即 $f[i - 1][j] \times (i - 1)$。
60+
61+
因此,状态转移方程为:
62+
63+
$$
64+
f[i][j] = f[i - 1][j - 1] + f[i - 1][j] \times (i - 1)
65+
$$
66+
67+
最终答案为 $f[n][k]$。
68+
69+
我们注意到 $f[i][j]$ 只跟 $f[i - 1][j - 1]$ 和 $f[i - 1][j]$ 有关,因此可以使用一维数组优化空间复杂度。
70+
71+
时间复杂度 $O(n \times k)$,空间复杂度 $O(k)$。其中 $n$ 和 $k$ 分别是题目中给定的两个整数。
72+
5573
<!-- tabs:start -->
5674

5775
### **Python3**
5876

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

6179
```python
80+
class Solution:
81+
def rearrangeSticks(self, n: int, k: int) -> int:
82+
mod = 10**9 + 7
83+
f = [[0] * (k + 1) for _ in range(n + 1)]
84+
f[0][0] = 1
85+
for i in range(1, n + 1):
86+
for j in range(1, k + 1):
87+
f[i][j] = (f[i - 1][j - 1] + f[i - 1][j] * (i - 1)) % mod
88+
return f[n][k]
89+
```
6290

91+
```python
92+
class Solution:
93+
def rearrangeSticks(self, n: int, k: int) -> int:
94+
mod = 10**9 + 7
95+
f = [1] + [0] * k
96+
for i in range(1, n + 1):
97+
for j in range(k, 0, -1):
98+
f[j] = (f[j] * (i - 1) + f[j - 1]) % mod
99+
f[0] = 0
100+
return f[k]
63101
```
64102

65103
### **Java**
66104

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

69107
```java
108+
class Solution {
109+
public int rearrangeSticks(int n, int k) {
110+
final int mod = (int) 1e9 + 7;
111+
int[][] f = new int[n + 1][k + 1];
112+
f[0][0] = 1;
113+
for (int i = 1; i <= n; ++i) {
114+
for (int j = 1; j <= k; ++j) {
115+
f[i][j] = (int) ((f[i - 1][j - 1] + f[i - 1][j] * (long) (i - 1)) % mod);
116+
}
117+
}
118+
return f[n][k];
119+
}
120+
}
121+
```
122+
123+
```java
124+
class Solution {
125+
public int rearrangeSticks(int n, int k) {
126+
final int mod = (int) 1e9 + 7;
127+
int[] f = new int[k + 1];
128+
f[0] = 1;
129+
for (int i = 1; i <= n; ++i) {
130+
for (int j = k; j > 0; --j) {
131+
f[j] = (int) ((f[j] * (i - 1L) + f[j - 1]) % mod);
132+
}
133+
f[0] = 0;
134+
}
135+
return f[k];
136+
}
137+
}
138+
```
139+
140+
### **C++**
141+
142+
```cpp
143+
class Solution {
144+
public:
145+
int rearrangeSticks(int n, int k) {
146+
const int mod = 1e9 + 7;
147+
int f[n + 1][k + 1];
148+
memset(f, 0, sizeof(f));
149+
f[0][0] = 1;
150+
for (int i = 1; i <= n; ++i) {
151+
for (int j = 1; j <= k; ++j) {
152+
f[i][j] = (f[i - 1][j - 1] + (i - 1LL) * f[i - 1][j]) % mod;
153+
}
154+
}
155+
return f[n][k];
156+
}
157+
};
158+
```
159+
160+
```cpp
161+
class Solution {
162+
public:
163+
int rearrangeSticks(int n, int k) {
164+
const int mod = 1e9 + 7;
165+
int f[k + 1];
166+
memset(f, 0, sizeof(f));
167+
f[0] = 1;
168+
for (int i = 1; i <= n; ++i) {
169+
for (int j = k; j; --j) {
170+
f[j] = (f[j - 1] + f[j] * (i - 1LL)) % mod;
171+
}
172+
f[0] = 0;
173+
}
174+
return f[k];
175+
}
176+
};
177+
```
178+
179+
### **Go**
180+
181+
```go
182+
func rearrangeSticks(n int, k int) int {
183+
const mod = 1e9 + 7
184+
f := make([][]int, n+1)
185+
for i := range f {
186+
f[i] = make([]int, k+1)
187+
}
188+
f[0][0] = 1
189+
for i := 1; i <= n; i++ {
190+
for j := 1; j <= k; j++ {
191+
f[i][j] = (f[i-1][j-1] + (i-1)*f[i-1][j]) % mod
192+
}
193+
}
194+
return f[n][k]
195+
}
196+
```
70197

198+
```go
199+
func rearrangeSticks(n int, k int) int {
200+
const mod = 1e9 + 7
201+
f := make([]int, k+1)
202+
f[0] = 1
203+
for i := 1; i <= n; i++ {
204+
for j := k; j > 0; j-- {
205+
f[j] = (f[j-1] + f[j]*(i-1)) % mod
206+
}
207+
f[0] = 0
208+
}
209+
return f[k]
210+
}
71211
```
72212

73213
### **...**

solution/1800-1899/1866.Number of Ways to Rearrange Sticks With K Sticks Visible/README_EN.md

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,135 @@ The visible sticks are underlined.
5454
### **Python3**
5555

5656
```python
57+
class Solution:
58+
def rearrangeSticks(self, n: int, k: int) -> int:
59+
mod = 10**9 + 7
60+
f = [1] + [0] * k
61+
for i in range(1, n + 1):
62+
for j in range(k, 0, -1):
63+
f[j] = (f[j] * (i - 1) + f[j - 1]) % mod
64+
f[0] = 0
65+
return f[k]
66+
```
5767

68+
```python
69+
class Solution:
70+
def rearrangeSticks(self, n: int, k: int) -> int:
71+
mod = 10**9 + 7
72+
f = [1] + [0] * k
73+
for i in range(1, n + 1):
74+
for j in range(k, 0, -1):
75+
f[j] = (f[j] * (i - 1) + f[j - 1]) % mod
76+
f[0] = 0
77+
return f[k]
5878
```
5979

6080
### **Java**
6181

6282
```java
83+
class Solution {
84+
public int rearrangeSticks(int n, int k) {
85+
final int mod = (int) 1e9 + 7;
86+
int[][] f = new int[n + 1][k + 1];
87+
f[0][0] = 1;
88+
for (int i = 1; i <= n; ++i) {
89+
for (int j = 1; j <= k; ++j) {
90+
f[i][j] = (int) ((f[i - 1][j - 1] + f[i - 1][j] * (long) (i - 1)) % mod);
91+
}
92+
}
93+
return f[n][k];
94+
}
95+
}
96+
```
97+
98+
```java
99+
class Solution {
100+
public int rearrangeSticks(int n, int k) {
101+
final int mod = (int) 1e9 + 7;
102+
int[] f = new int[k + 1];
103+
f[0] = 1;
104+
for (int i = 1; i <= n; ++i) {
105+
for (int j = k; j > 0; --j) {
106+
f[j] = (int) ((f[j] * (i - 1L) + f[j - 1]) % mod);
107+
}
108+
f[0] = 0;
109+
}
110+
return f[k];
111+
}
112+
}
113+
```
114+
115+
### **C++**
116+
117+
```cpp
118+
class Solution {
119+
public:
120+
int rearrangeSticks(int n, int k) {
121+
const int mod = 1e9 + 7;
122+
int f[n + 1][k + 1];
123+
memset(f, 0, sizeof(f));
124+
f[0][0] = 1;
125+
for (int i = 1; i <= n; ++i) {
126+
for (int j = 1; j <= k; ++j) {
127+
f[i][j] = (f[i - 1][j - 1] + (i - 1LL) * f[i - 1][j]) % mod;
128+
}
129+
}
130+
return f[n][k];
131+
}
132+
};
133+
```
134+
135+
```cpp
136+
class Solution {
137+
public:
138+
int rearrangeSticks(int n, int k) {
139+
const int mod = 1e9 + 7;
140+
int f[k + 1];
141+
memset(f, 0, sizeof(f));
142+
f[0] = 1;
143+
for (int i = 1; i <= n; ++i) {
144+
for (int j = k; j; --j) {
145+
f[j] = (f[j - 1] + f[j] * (i - 1LL)) % mod;
146+
}
147+
f[0] = 0;
148+
}
149+
return f[k];
150+
}
151+
};
152+
```
153+
154+
### **Go**
155+
156+
```go
157+
func rearrangeSticks(n int, k int) int {
158+
const mod = 1e9 + 7
159+
f := make([][]int, n+1)
160+
for i := range f {
161+
f[i] = make([]int, k+1)
162+
}
163+
f[0][0] = 1
164+
for i := 1; i <= n; i++ {
165+
for j := 1; j <= k; j++ {
166+
f[i][j] = (f[i-1][j-1] + (i-1)*f[i-1][j]) % mod
167+
}
168+
}
169+
return f[n][k]
170+
}
171+
```
63172

173+
```go
174+
func rearrangeSticks(n int, k int) int {
175+
const mod = 1e9 + 7
176+
f := make([]int, k+1)
177+
f[0] = 1
178+
for i := 1; i <= n; i++ {
179+
for j := k; j > 0; j-- {
180+
f[j] = (f[j-1] + f[j]*(i-1)) % mod
181+
}
182+
f[0] = 0
183+
}
184+
return f[k]
185+
}
64186
```
65187

66188
### **...**
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution {
2+
public:
3+
int rearrangeSticks(int n, int k) {
4+
const int mod = 1e9 + 7;
5+
int f[k + 1];
6+
memset(f, 0, sizeof(f));
7+
f[0] = 1;
8+
for (int i = 1; i <= n; ++i) {
9+
for (int j = k; j; --j) {
10+
f[j] = (f[j - 1] + f[j] * (i - 1LL)) % mod;
11+
}
12+
f[0] = 0;
13+
}
14+
return f[k];
15+
}
16+
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
func rearrangeSticks(n int, k int) int {
2+
const mod = 1e9 + 7
3+
f := make([]int, k+1)
4+
f[0] = 1
5+
for i := 1; i <= n; i++ {
6+
for j := k; j > 0; j-- {
7+
f[j] = (f[j-1] + f[j]*(i-1)) % mod
8+
}
9+
f[0] = 0
10+
}
11+
return f[k]
12+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution {
2+
public int rearrangeSticks(int n, int k) {
3+
final int mod = (int) 1e9 + 7;
4+
int[] f = new int[k + 1];
5+
f[0] = 1;
6+
for (int i = 1; i <= n; ++i) {
7+
for (int j = k; j > 0; --j) {
8+
f[j] = (int) ((f[j] * (i - 1L) + f[j - 1]) % mod);
9+
}
10+
f[0] = 0;
11+
}
12+
return f[k];
13+
}
14+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution:
2+
def rearrangeSticks(self, n: int, k: int) -> int:
3+
mod = 10**9 + 7
4+
f = [1] + [0] * k
5+
for i in range(1, n + 1):
6+
for j in range(k, 0, -1):
7+
f[j] = (f[j] * (i - 1) + f[j - 1]) % mod
8+
f[0] = 0
9+
return f[k]

0 commit comments

Comments
 (0)