Skip to content

Commit ea98d0c

Browse files
committed
feat: add solutions to lc problem: No.1359
No.1359.Count All Valid Pickup and Delivery Options
1 parent 10a5512 commit ea98d0c

File tree

6 files changed

+142
-2
lines changed

6 files changed

+142
-2
lines changed

solution/1300-1399/1359.Count All Valid Pickup and Delivery Options/README.md

+61-1
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,82 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51+
**方法一:动态规划**
52+
53+
我们定义 $f[i]$ 表示 $i$ 个订单的所有有效的收件/配送序列的数目。初始时 $f[1] = 1$。
54+
55+
我们可以选择这 $i$ 个订单中的任意一个作为最后一个配送的订单 $D_i$,那么它的收件订单 $P_i$ 可以在之前 $2 \times i - 1$ 的任意一个位置,剩下的 $i - 1$ 个订单的配送/收件序列数目为 $f[i - 1]$,所以 $f[i]$ 可以表示为:
56+
57+
$$
58+
f[i] = i \times (2 \times i - 1) \times f[i - 1]
59+
$$
60+
61+
最终的答案即为 $f[n]$。
62+
63+
我们注意到 $f[i]$ 的值只与 $f[i - 1]$ 有关,所以可以用一个变量代替数组,降低空间复杂度。
64+
65+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为订单数目。
66+
5167
<!-- tabs:start -->
5268

5369
### **Python3**
5470

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

5773
```python
58-
74+
class Solution:
75+
def countOrders(self, n: int) -> int:
76+
mod = 10**9 + 7
77+
f = 1
78+
for i in range(2, n + 1):
79+
f = (f * i * (2 * i - 1)) % mod
80+
return f
5981
```
6082

6183
### **Java**
6284

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

6587
```java
88+
class Solution {
89+
public int countOrders(int n) {
90+
final int mod = (int) 1e9 + 7;
91+
long f = 1;
92+
for (int i = 2; i <= n; ++i) {
93+
f = f * i * (2 * i - 1) % mod;
94+
}
95+
return (int) f;
96+
}
97+
}
98+
```
99+
100+
### **C++**
101+
102+
```cpp
103+
class Solution {
104+
public:
105+
int countOrders(int n) {
106+
const int mod = 1e9 + 7;
107+
long long f = 1;
108+
for (int i = 2; i <= n; ++i) {
109+
f = f * i * (2 * i - 1) % mod;
110+
}
111+
return f;
112+
}
113+
};
114+
```
66115
116+
### **Go**
117+
118+
```go
119+
func countOrders(n int) int {
120+
const mod = 1e9 + 7
121+
f := 1
122+
for i := 2; i <= n; i++ {
123+
f = f * i * (2*i - 1) % mod
124+
}
125+
return f
126+
}
67127
```
68128

69129
### **...**

solution/1300-1399/1359.Count All Valid Pickup and Delivery Options/README_EN.md

+45-1
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,57 @@ This is an invalid order (P1,D2,P2,D1) because Pickup 2 is after of Delivery 2.
5050
### **Python3**
5151

5252
```python
53-
53+
class Solution:
54+
def countOrders(self, n: int) -> int:
55+
mod = 10**9 + 7
56+
f = 1
57+
for i in range(2, n + 1):
58+
f = (f * i * (2 * i - 1)) % mod
59+
return f
5460
```
5561

5662
### **Java**
5763

5864
```java
65+
class Solution {
66+
public int countOrders(int n) {
67+
final int mod = (int) 1e9 + 7;
68+
long f = 1;
69+
for (int i = 2; i <= n; ++i) {
70+
f = f * i * (2 * i - 1) % mod;
71+
}
72+
return (int) f;
73+
}
74+
}
75+
```
76+
77+
### **C++**
78+
79+
```cpp
80+
class Solution {
81+
public:
82+
int countOrders(int n) {
83+
const int mod = 1e9 + 7;
84+
long long f = 1;
85+
for (int i = 2; i <= n; ++i) {
86+
f = f * i * (2 * i - 1) % mod;
87+
}
88+
return f;
89+
}
90+
};
91+
```
5992
93+
### **Go**
94+
95+
```go
96+
func countOrders(n int) int {
97+
const mod = 1e9 + 7
98+
f := 1
99+
for i := 2; i <= n; i++ {
100+
f = f * i * (2*i - 1) % mod
101+
}
102+
return f
103+
}
60104
```
61105

62106
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution {
2+
public:
3+
int countOrders(int n) {
4+
const int mod = 1e9 + 7;
5+
long long f = 1;
6+
for (int i = 2; i <= n; ++i) {
7+
f = f * i * (2 * i - 1) % mod;
8+
}
9+
return f;
10+
}
11+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
func countOrders(n int) int {
2+
const mod = 1e9 + 7
3+
f := 1
4+
for i := 2; i <= n; i++ {
5+
f = f * i * (2*i - 1) % mod
6+
}
7+
return f
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution {
2+
public int countOrders(int n) {
3+
final int mod = (int) 1e9 + 7;
4+
long f = 1;
5+
for (int i = 2; i <= n; ++i) {
6+
f = f * i * (2 * i - 1) % mod;
7+
}
8+
return (int) f;
9+
}
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
class Solution:
2+
def countOrders(self, n: int) -> int:
3+
mod = 10**9 + 7
4+
f = 1
5+
for i in range(2, n + 1):
6+
f = (f * i * (2 * i - 1)) % mod
7+
return f

0 commit comments

Comments
 (0)