Skip to content

Commit 2c82292

Browse files
authored
feat: add solutions to lc problem: No.3018 (doocs#2264)
No.3018.Maximum Number of Removal Queries That Can Be Processed I
1 parent bea91cb commit 2c82292

File tree

7 files changed

+444
-8
lines changed

7 files changed

+444
-8
lines changed

solution/3000-3099/3018.Maximum Number of Removal Queries That Can Be Processed I/README.md

+153-4
Original file line numberDiff line numberDiff line change
@@ -77,24 +77,173 @@ It can be shown that we can't process more than 2 queries.
7777

7878
## 解法
7979

80-
### 方法一
80+
### 方法一:动态规划
81+
82+
我们定义 $f[i][j]$ 表示区间 $[i, j]$ 的数还没有被删除时,我们能够处理的查询的最大数量。
83+
84+
考虑 $f[i][j]$:
85+
86+
- 如果 $i \gt 0$,此时 $f[i][j]$ 的值可以由 $f[i - 1][j]$ 转移而来。如果 $nums[i - 1] \ge queries[f[i - 1][j]]$,那么我们可以选择删除 $nums[i - 1]$,因此我们有 $f[i][j] = f[i - 1][j] + (nums[i - 1] \ge queries[f[i - 1][j]])$。
87+
- 如果 $j + 1 \lt n$,此时 $f[i][j]$ 的值可以由 $f[i][j + 1]$ 转移而来。如果 $nums[j + 1] \ge queries[f[i][j + 1]]$,那么我们可以选择删除 $nums[j + 1]$,因此我们有 $f[i][j] = f[i][j + 1] + (nums[j + 1] \ge queries[f[i][j + 1]])$。
88+
- 如果 $f[i][j] = m$,那么我们就可以直接返回 $m$。
89+
90+
最后的答案即为 $\max\limits_{0 \le i \lt n} f[i][i] + (nums[i] \ge queries[f[i][i]])$。
91+
92+
时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 为数组 $nums$ 的长度。
8193

8294
<!-- tabs:start -->
8395

8496
```python
85-
97+
class Solution:
98+
def maximumProcessableQueries(self, nums: List[int], queries: List[int]) -> int:
99+
n = len(nums)
100+
f = [[0] * n for _ in range(n)]
101+
m = len(queries)
102+
for i in range(n):
103+
for j in range(n - 1, i - 1, -1):
104+
if i:
105+
f[i][j] = max(
106+
f[i][j], f[i - 1][j] + (nums[i - 1] >= queries[f[i - 1][j]])
107+
)
108+
if j + 1 < n:
109+
f[i][j] = max(
110+
f[i][j], f[i][j + 1] + (nums[j + 1] >= queries[f[i][j + 1]])
111+
)
112+
if f[i][j] == m:
113+
return m
114+
return max(f[i][i] + (nums[i] >= queries[f[i][i]]) for i in range(n))
86115
```
87116

88117
```java
89-
118+
class Solution {
119+
public int maximumProcessableQueries(int[] nums, int[] queries) {
120+
int n = nums.length;
121+
int[][] f = new int[n][n];
122+
int m = queries.length;
123+
for (int i = 0; i < n; ++i) {
124+
for (int j = n - 1; j >= i; --j) {
125+
if (i > 0) {
126+
f[i][j] = Math.max(
127+
f[i][j], f[i - 1][j] + (nums[i - 1] >= queries[f[i - 1][j]] ? 1 : 0));
128+
}
129+
if (j + 1 < n) {
130+
f[i][j] = Math.max(
131+
f[i][j], f[i][j + 1] + (nums[j + 1] >= queries[f[i][j + 1]] ? 1 : 0));
132+
}
133+
if (f[i][j] == m) {
134+
return m;
135+
}
136+
}
137+
}
138+
int ans = 0;
139+
for (int i = 0; i < n; ++i) {
140+
ans = Math.max(ans, f[i][i] + (nums[i] >= queries[f[i][i]] ? 1 : 0));
141+
}
142+
return ans;
143+
}
144+
}
90145
```
91146

92147
```cpp
93-
148+
class Solution {
149+
public:
150+
int maximumProcessableQueries(vector<int>& nums, vector<int>& queries) {
151+
int n = nums.size();
152+
int f[n][n];
153+
memset(f, 0, sizeof(f));
154+
int m = queries.size();
155+
for (int i = 0; i < n; ++i) {
156+
for (int j = n - 1; j >= i; --j) {
157+
if (i > 0) {
158+
f[i][j] = max(f[i][j], f[i - 1][j] + (nums[i - 1] >= queries[f[i - 1][j]] ? 1 : 0));
159+
}
160+
if (j + 1 < n) {
161+
f[i][j] = max(f[i][j], f[i][j + 1] + (nums[j + 1] >= queries[f[i][j + 1]] ? 1 : 0));
162+
}
163+
if (f[i][j] == m) {
164+
return m;
165+
}
166+
}
167+
}
168+
int ans = 0;
169+
for (int i = 0; i < n; ++i) {
170+
ans = max(ans, f[i][i] + (nums[i] >= queries[f[i][i]] ? 1 : 0));
171+
}
172+
return ans;
173+
}
174+
};
94175
```
95176
96177
```go
178+
func maximumProcessableQueries(nums []int, queries []int) (ans int) {
179+
n := len(nums)
180+
f := make([][]int, n)
181+
for i := range f {
182+
f[i] = make([]int, n)
183+
}
184+
m := len(queries)
185+
for i := 0; i < n; i++ {
186+
for j := n - 1; j >= i; j-- {
187+
if i > 0 {
188+
t := 0
189+
if nums[i-1] >= queries[f[i-1][j]] {
190+
t = 1
191+
}
192+
f[i][j] = max(f[i][j], f[i-1][j]+t)
193+
}
194+
if j+1 < n {
195+
t := 0
196+
if nums[j+1] >= queries[f[i][j+1]] {
197+
t = 1
198+
}
199+
f[i][j] = max(f[i][j], f[i][j+1]+t)
200+
}
201+
if f[i][j] == m {
202+
return m
203+
}
204+
}
205+
}
206+
for i := 0; i < n; i++ {
207+
t := 0
208+
if nums[i] >= queries[f[i][i]] {
209+
t = 1
210+
}
211+
ans = max(ans, f[i][i]+t)
212+
}
213+
return
214+
}
215+
```
97216

217+
```ts
218+
function maximumProcessableQueries(nums: number[], queries: number[]): number {
219+
const n = nums.length;
220+
const f: number[][] = Array.from({ length: n }, () => Array.from({ length: n }, () => 0));
221+
const m = queries.length;
222+
for (let i = 0; i < n; ++i) {
223+
for (let j = n - 1; j >= i; --j) {
224+
if (i > 0) {
225+
f[i][j] = Math.max(
226+
f[i][j],
227+
f[i - 1][j] + (nums[i - 1] >= queries[f[i - 1][j]] ? 1 : 0),
228+
);
229+
}
230+
if (j + 1 < n) {
231+
f[i][j] = Math.max(
232+
f[i][j],
233+
f[i][j + 1] + (nums[j + 1] >= queries[f[i][j + 1]] ? 1 : 0),
234+
);
235+
}
236+
if (f[i][j] == m) {
237+
return m;
238+
}
239+
}
240+
}
241+
let ans = 0;
242+
for (let i = 0; i < n; ++i) {
243+
ans = Math.max(ans, f[i][i] + (nums[i] >= queries[f[i][i]] ? 1 : 0));
244+
}
245+
return ans;
246+
}
98247
```
99248

100249
<!-- tabs:end -->

solution/3000-3099/3018.Maximum Number of Removal Queries That Can Be Processed I/README_EN.md

+153-4
Original file line numberDiff line numberDiff line change
@@ -75,24 +75,173 @@ It can be shown that we can&#39;t process more than 2 queries.
7575

7676
## Solutions
7777

78-
### Solution 1
78+
### Solution 1: Dynamic Programming
79+
80+
We define $f[i][j]$ as the maximum number of queries we can handle when the numbers in the interval $[i, j]$ have not been deleted yet.
81+
82+
Consider $f[i][j]$:
83+
84+
- If $i > 0$, the value of $f[i][j]$ can be transferred from $f[i - 1][j]$. If $nums[i - 1] \ge queries[f[i - 1][j]]$, we can choose to delete $nums[i - 1]$. Therefore, we have $f[i][j] = f[i - 1][j] + (nums[i - 1] \ge queries[f[i - 1][j]])$.
85+
- If $j + 1 < n$, the value of $f[i][j]$ can be transferred from $f[i][j + 1]$. If $nums[j + 1] \ge queries[f[i][j + 1]]$, we can choose to delete $nums[j + 1]$. Therefore, we have $f[i][j] = f[i][j + 1] + (nums[j + 1] \ge queries[f[i][j + 1]])$.
86+
- If $f[i][j] = m$, we can directly return $m$.
87+
88+
The final answer is $\max\limits_{0 \le i < n} f[i][i] + (nums[i] \ge queries[f[i][i]])$.
89+
90+
The time complexity is $O(n^2)$, and the space complexity is $O(n^2)$. Here, $n$ is the length of the array $nums$.
7991

8092
<!-- tabs:start -->
8193

8294
```python
83-
95+
class Solution:
96+
def maximumProcessableQueries(self, nums: List[int], queries: List[int]) -> int:
97+
n = len(nums)
98+
f = [[0] * n for _ in range(n)]
99+
m = len(queries)
100+
for i in range(n):
101+
for j in range(n - 1, i - 1, -1):
102+
if i:
103+
f[i][j] = max(
104+
f[i][j], f[i - 1][j] + (nums[i - 1] >= queries[f[i - 1][j]])
105+
)
106+
if j + 1 < n:
107+
f[i][j] = max(
108+
f[i][j], f[i][j + 1] + (nums[j + 1] >= queries[f[i][j + 1]])
109+
)
110+
if f[i][j] == m:
111+
return m
112+
return max(f[i][i] + (nums[i] >= queries[f[i][i]]) for i in range(n))
84113
```
85114

86115
```java
87-
116+
class Solution {
117+
public int maximumProcessableQueries(int[] nums, int[] queries) {
118+
int n = nums.length;
119+
int[][] f = new int[n][n];
120+
int m = queries.length;
121+
for (int i = 0; i < n; ++i) {
122+
for (int j = n - 1; j >= i; --j) {
123+
if (i > 0) {
124+
f[i][j] = Math.max(
125+
f[i][j], f[i - 1][j] + (nums[i - 1] >= queries[f[i - 1][j]] ? 1 : 0));
126+
}
127+
if (j + 1 < n) {
128+
f[i][j] = Math.max(
129+
f[i][j], f[i][j + 1] + (nums[j + 1] >= queries[f[i][j + 1]] ? 1 : 0));
130+
}
131+
if (f[i][j] == m) {
132+
return m;
133+
}
134+
}
135+
}
136+
int ans = 0;
137+
for (int i = 0; i < n; ++i) {
138+
ans = Math.max(ans, f[i][i] + (nums[i] >= queries[f[i][i]] ? 1 : 0));
139+
}
140+
return ans;
141+
}
142+
}
88143
```
89144

90145
```cpp
91-
146+
class Solution {
147+
public:
148+
int maximumProcessableQueries(vector<int>& nums, vector<int>& queries) {
149+
int n = nums.size();
150+
int f[n][n];
151+
memset(f, 0, sizeof(f));
152+
int m = queries.size();
153+
for (int i = 0; i < n; ++i) {
154+
for (int j = n - 1; j >= i; --j) {
155+
if (i > 0) {
156+
f[i][j] = max(f[i][j], f[i - 1][j] + (nums[i - 1] >= queries[f[i - 1][j]] ? 1 : 0));
157+
}
158+
if (j + 1 < n) {
159+
f[i][j] = max(f[i][j], f[i][j + 1] + (nums[j + 1] >= queries[f[i][j + 1]] ? 1 : 0));
160+
}
161+
if (f[i][j] == m) {
162+
return m;
163+
}
164+
}
165+
}
166+
int ans = 0;
167+
for (int i = 0; i < n; ++i) {
168+
ans = max(ans, f[i][i] + (nums[i] >= queries[f[i][i]] ? 1 : 0));
169+
}
170+
return ans;
171+
}
172+
};
92173
```
93174
94175
```go
176+
func maximumProcessableQueries(nums []int, queries []int) (ans int) {
177+
n := len(nums)
178+
f := make([][]int, n)
179+
for i := range f {
180+
f[i] = make([]int, n)
181+
}
182+
m := len(queries)
183+
for i := 0; i < n; i++ {
184+
for j := n - 1; j >= i; j-- {
185+
if i > 0 {
186+
t := 0
187+
if nums[i-1] >= queries[f[i-1][j]] {
188+
t = 1
189+
}
190+
f[i][j] = max(f[i][j], f[i-1][j]+t)
191+
}
192+
if j+1 < n {
193+
t := 0
194+
if nums[j+1] >= queries[f[i][j+1]] {
195+
t = 1
196+
}
197+
f[i][j] = max(f[i][j], f[i][j+1]+t)
198+
}
199+
if f[i][j] == m {
200+
return m
201+
}
202+
}
203+
}
204+
for i := 0; i < n; i++ {
205+
t := 0
206+
if nums[i] >= queries[f[i][i]] {
207+
t = 1
208+
}
209+
ans = max(ans, f[i][i]+t)
210+
}
211+
return
212+
}
213+
```
95214

215+
```ts
216+
function maximumProcessableQueries(nums: number[], queries: number[]): number {
217+
const n = nums.length;
218+
const f: number[][] = Array.from({ length: n }, () => Array.from({ length: n }, () => 0));
219+
const m = queries.length;
220+
for (let i = 0; i < n; ++i) {
221+
for (let j = n - 1; j >= i; --j) {
222+
if (i > 0) {
223+
f[i][j] = Math.max(
224+
f[i][j],
225+
f[i - 1][j] + (nums[i - 1] >= queries[f[i - 1][j]] ? 1 : 0),
226+
);
227+
}
228+
if (j + 1 < n) {
229+
f[i][j] = Math.max(
230+
f[i][j],
231+
f[i][j + 1] + (nums[j + 1] >= queries[f[i][j + 1]] ? 1 : 0),
232+
);
233+
}
234+
if (f[i][j] == m) {
235+
return m;
236+
}
237+
}
238+
}
239+
let ans = 0;
240+
for (let i = 0; i < n; ++i) {
241+
ans = Math.max(ans, f[i][i] + (nums[i] >= queries[f[i][i]] ? 1 : 0));
242+
}
243+
return ans;
244+
}
96245
```
97246

98247
<!-- tabs:end -->
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public:
3+
int maximumProcessableQueries(vector<int>& nums, vector<int>& queries) {
4+
int n = nums.size();
5+
int f[n][n];
6+
memset(f, 0, sizeof(f));
7+
int m = queries.size();
8+
for (int i = 0; i < n; ++i) {
9+
for (int j = n - 1; j >= i; --j) {
10+
if (i > 0) {
11+
f[i][j] = max(f[i][j], f[i - 1][j] + (nums[i - 1] >= queries[f[i - 1][j]] ? 1 : 0));
12+
}
13+
if (j + 1 < n) {
14+
f[i][j] = max(f[i][j], f[i][j + 1] + (nums[j + 1] >= queries[f[i][j + 1]] ? 1 : 0));
15+
}
16+
if (f[i][j] == m) {
17+
return m;
18+
}
19+
}
20+
}
21+
int ans = 0;
22+
for (int i = 0; i < n; ++i) {
23+
ans = max(ans, f[i][i] + (nums[i] >= queries[f[i][i]] ? 1 : 0));
24+
}
25+
return ans;
26+
}
27+
};

0 commit comments

Comments
 (0)