Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit aec8527

Browse files
feat: add solutions to lc problem: No.3231 (doocs#3320)
No.3231.Minimum Number of Increasing Subsequence to Be Removed
1 parent 01a0b03 commit aec8527

File tree

11 files changed

+603
-1
lines changed

11 files changed

+603
-1
lines changed

‎solution/0500-0599/0545.Boundary of Binary Tree/README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ tags:
1818

1919
<!-- description:start -->
2020

21-
<p>二叉树的 <strong>边界</strong> 是由 <strong>根节点 </strong>, <strong>左边界</strong> , 按从左到右顺序的<strong> 叶节点</strong> 和 <strong>逆序的右边界</strong> ,按顺序依次连接组成。</p>
21+
<p>二叉树的 <strong>边界</strong> 是由 <strong>根节点 </strong><strong>左边界</strong> 按从左到右顺序的<strong> 叶节点</strong> 和 <strong>逆序的右边界</strong> ,按顺序依次连接组成。</p>
2222

2323
<p><strong>左边界 </strong>是满足下述定义的节点集合:</p>
2424

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
---
2+
comments: true
3+
difficulty: 困难
4+
edit_url: https://github.com/doocs/leetcode/edit/main/solution/3200-3299/3231.Minimum%20Number%20of%20Increasing%20Subsequence%20to%20Be%20Removed/README.md
5+
---
6+
7+
<!-- problem:start -->
8+
9+
# [3231. Minimum Number of Increasing Subsequence to Be Removed 🔒](https://leetcode.cn/problems/minimum-number-of-increasing-subsequence-to-be-removed)
10+
11+
[English Version](/solution/3200-3299/3231.Minimum%20Number%20of%20Increasing%20Subsequence%20to%20Be%20Removed/README_EN.md)
12+
13+
## 题目描述
14+
15+
<!-- description:start -->
16+
17+
<p>Given an array of integers <code>nums</code>, you are allowed to perform the following operation any number of times:</p>
18+
19+
<ul>
20+
<li>Remove a <strong>strictly increasing</strong> <span data-keyword="subsequence-array">subsequence</span> from the array.</li>
21+
</ul>
22+
23+
<p>Your task is to find the <strong>minimum</strong> number of operations required to make the array <strong>empty</strong>.</p>
24+
25+
<p>&nbsp;</p>
26+
<p><strong class="example">Example 1:</strong></p>
27+
28+
<div class="example-block">
29+
<p><strong>Input:</strong> <span class="example-io">nums = [5,3,1,4,2]</span></p>
30+
31+
<p><strong>Output:</strong> <span class="example-io">3</span></p>
32+
33+
<p><strong>Explanation:</strong></p>
34+
35+
<p>We remove subsequences <code>[1, 2]</code>, <code>[3, 4]</code>, <code>[5]</code>.</p>
36+
</div>
37+
38+
<p><strong class="example">Example 2:</strong></p>
39+
40+
<div class="example-block">
41+
<p><strong>Input:</strong> <span class="example-io">nums = [1,2,3,4,5]</span></p>
42+
43+
<p><strong>Output:</strong> <span class="example-io">1</span></p>
44+
</div>
45+
46+
<p><strong class="example">Example 3:</strong></p>
47+
48+
<div class="example-block">
49+
<p><strong>Input:</strong> <span class="example-io">nums = [5,4,3,2,1]</span></p>
50+
51+
<p><strong>Output:</strong> <span class="example-io">5</span></p>
52+
</div>
53+
54+
<p>&nbsp;</p>
55+
<p><strong>Constraints:</strong></p>
56+
57+
<ul>
58+
<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
59+
<li><code>1 &lt;= nums[i] &lt;= 10<sup>5</sup></code></li>
60+
</ul>
61+
62+
<!-- description:end -->
63+
64+
## 解法
65+
66+
<!-- solution:start -->
67+
68+
### 方法一:贪心 + 二分查找
69+
70+
我们从左到右遍历数组 $\textit{nums},ドル对于每个元素 $x,ドル我们需要贪心地将其追加到前面序列中最后一个元素小于 $x$ 的最大值后面。如果找不到这样的元素,则说明当前元素 $x$ 比前面序列中的所有元素都小,我们需要新开辟一个序列,将 $x$ 放入其中。
71+
72+
这样分析下来,我们可以发现,前面序列中的最后一个元素呈单调递减的状态。因此,我们可以使用二分查找来找到前面序列中最后一个元素小于 $x$ 的第一个元素位置,然后将 $x$ 放入该位置。
73+
74+
最终,我们返回序列的个数即可。
75+
76+
时间复杂度 $O(n \times \log n),ドル空间复杂度 $O(n)$。其中 $n$ 为数组 $\textit{nums}$ 的长度。
77+
78+
<!-- tabs:start -->
79+
80+
#### Python3
81+
82+
```python
83+
class Solution:
84+
def minOperations(self, nums: List[int]) -> int:
85+
g = []
86+
for x in nums:
87+
l, r = 0, len(g)
88+
while l < r:
89+
mid = (l + r) >> 1
90+
if g[mid] < x:
91+
r = mid
92+
else:
93+
l = mid + 1
94+
if l == len(g):
95+
g.append(x)
96+
else:
97+
g[l] = x
98+
return len(g)
99+
```
100+
101+
#### Java
102+
103+
```java
104+
class Solution {
105+
public int minOperations(int[] nums) {
106+
List<Integer> g = new ArrayList<>();
107+
for (int x : nums) {
108+
int l = 0, r = g.size();
109+
while (l < r) {
110+
int mid = (l + r) >> 1;
111+
if (g.get(mid) < x) {
112+
r = mid;
113+
} else {
114+
l = mid + 1;
115+
}
116+
}
117+
if (l == g.size()) {
118+
g.add(x);
119+
} else {
120+
g.set(l, x);
121+
}
122+
}
123+
return g.size();
124+
}
125+
}
126+
```
127+
128+
#### C++
129+
130+
```cpp
131+
class Solution {
132+
public:
133+
int minOperations(vector<int>& nums) {
134+
vector<int> g;
135+
for (int x : nums) {
136+
int l = 0, r = g.size();
137+
while (l < r) {
138+
int mid = (l + r) >> 1;
139+
if (g[mid] < x) {
140+
r = mid;
141+
} else {
142+
l = mid + 1;
143+
}
144+
}
145+
if (l == g.size()) {
146+
g.push_back(x);
147+
} else {
148+
g[l] = x;
149+
}
150+
}
151+
return g.size();
152+
}
153+
};
154+
```
155+
156+
#### Go
157+
158+
```go
159+
func minOperations(nums []int) int {
160+
g := []int{}
161+
for _, x := range nums {
162+
l, r := 0, len(g)
163+
for l < r {
164+
mid := (l + r) >> 1
165+
if g[mid] < x {
166+
r = mid
167+
} else {
168+
l = mid + 1
169+
}
170+
}
171+
if l == len(g) {
172+
g = append(g, x)
173+
} else {
174+
g[l] = x
175+
}
176+
}
177+
return len(g)
178+
}
179+
```
180+
181+
#### TypeScript
182+
183+
```ts
184+
function minOperations(nums: number[]): number {
185+
const g: number[] = [];
186+
for (const x of nums) {
187+
let [l, r] = [0, g.length];
188+
while (l < r) {
189+
const mid = (l + r) >> 1;
190+
if (g[mid] < x) {
191+
r = mid;
192+
} else {
193+
l = mid + 1;
194+
}
195+
}
196+
if (l === g.length) {
197+
g.push(x);
198+
} else {
199+
g[l] = x;
200+
}
201+
}
202+
return g.length;
203+
}
204+
```
205+
206+
#### Rust
207+
208+
```rust
209+
impl Solution {
210+
pub fn min_operations(nums: Vec<i32>) -> i32 {
211+
let mut g = Vec::new();
212+
for &x in nums.iter() {
213+
let mut l = 0;
214+
let mut r = g.len();
215+
while l < r {
216+
let mid = (l + r) / 2;
217+
if g[mid] < x {
218+
r = mid;
219+
} else {
220+
l = mid + 1;
221+
}
222+
}
223+
if l == g.len() {
224+
g.push(x);
225+
} else {
226+
g[l] = x;
227+
}
228+
}
229+
g.len() as i32
230+
}
231+
}
232+
```
233+
234+
<!-- tabs:end -->
235+
236+
<!-- solution:end -->
237+
238+
<!-- problem:end -->

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /