Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 2ea718e

Browse files
authored
feat: add solutions to lc problem: No.0646 (doocs#3729)
No.0646.Maximum Length of Pair Chain
1 parent c3f1e60 commit 2ea718e

File tree

14 files changed

+117
-486
lines changed

14 files changed

+117
-486
lines changed

solution/0600-0699/0646.Maximum Length of Pair Chain/README.md

Lines changed: 35 additions & 174 deletions
Original file line numberDiff line numberDiff line change
@@ -60,148 +60,15 @@ tags:
6060

6161
<!-- solution:start -->
6262

63-
### 方法一:动态规划
63+
### 方法一:排序 + 贪心
6464

65-
先将 pairs 按照第一个数字升序排列,然后转换为最长上升子序列问题
65+
我们将所有数对按照第二个数的升序排序,用一个变量 $\textit{pre}$ 维护已经选择的数对的第二个数的最大值
6666

67-
朴素做法,时间复杂度 $O(n^2)$
67+
遍历排序后的数对,如果当前数对的第一个数大于 $\textit{pre}$,那么我们可以贪心地选择当前数对,答案加一,并将 $\textit{pre}$ 更新为当前数对的第二个数
6868

69-
<!-- tabs:start -->
70-
71-
#### Python3
72-
73-
```python
74-
class Solution:
75-
def findLongestChain(self, pairs: List[List[int]]) -> int:
76-
pairs.sort()
77-
dp = [1] * len(pairs)
78-
for i, (c, _) in enumerate(pairs):
79-
for j, (_, b) in enumerate(pairs[:i]):
80-
if b < c:
81-
dp[i] = max(dp[i], dp[j] + 1)
82-
return max(dp)
83-
```
84-
85-
#### Java
86-
87-
```java
88-
class Solution {
89-
public int findLongestChain(int[][] pairs) {
90-
Arrays.sort(pairs, Comparator.comparingInt(a -> a[0]));
91-
int n = pairs.length;
92-
int[] dp = new int[n];
93-
int ans = 0;
94-
for (int i = 0; i < n; ++i) {
95-
dp[i] = 1;
96-
int c = pairs[i][0];
97-
for (int j = 0; j < i; ++j) {
98-
int b = pairs[j][1];
99-
if (b < c) {
100-
dp[i] = Math.max(dp[i], dp[j] + 1);
101-
}
102-
}
103-
ans = Math.max(ans, dp[i]);
104-
}
105-
return ans;
106-
}
107-
}
108-
```
109-
110-
#### C++
111-
112-
```cpp
113-
class Solution {
114-
public:
115-
int findLongestChain(vector<vector<int>>& pairs) {
116-
sort(pairs.begin(), pairs.end());
117-
int n = pairs.size();
118-
vector<int> dp(n, 1);
119-
for (int i = 0; i < n; ++i) {
120-
int c = pairs[i][0];
121-
for (int j = 0; j < i; ++j) {
122-
int b = pairs[j][1];
123-
if (b < c) dp[i] = max(dp[i], dp[j] + 1);
124-
}
125-
}
126-
return *max_element(dp.begin(), dp.end());
127-
}
128-
};
129-
```
130-
131-
#### Go
132-
133-
```go
134-
func findLongestChain(pairs [][]int) int {
135-
sort.Slice(pairs, func(i, j int) bool {
136-
return pairs[i][0] < pairs[j][0]
137-
})
138-
n := len(pairs)
139-
dp := make([]int, n)
140-
ans := 0
141-
for i := range pairs {
142-
dp[i] = 1
143-
c := pairs[i][0]
144-
for j := range pairs[:i] {
145-
b := pairs[j][1]
146-
if b < c {
147-
dp[i] = max(dp[i], dp[j]+1)
148-
}
149-
}
150-
ans = max(ans, dp[i])
151-
}
152-
return ans
153-
}
154-
```
155-
156-
#### TypeScript
157-
158-
```ts
159-
function findLongestChain(pairs: number[][]): number {
160-
pairs.sort((a, b) => a[0] - b[0]);
161-
const n = pairs.length;
162-
const dp = new Array(n).fill(1);
163-
for (let i = 0; i < n; i++) {
164-
for (let j = 0; j < i; j++) {
165-
if (pairs[i][0] > pairs[j][1]) {
166-
dp[i] = Math.max(dp[i], dp[j] + 1);
167-
}
168-
}
169-
}
170-
return dp[n - 1];
171-
}
172-
```
173-
174-
#### Rust
175-
176-
```rust
177-
impl Solution {
178-
pub fn find_longest_chain(mut pairs: Vec<Vec<i32>>) -> i32 {
179-
pairs.sort_by(|a, b| a[0].cmp(&b[0]));
180-
let n = pairs.len();
181-
let mut dp = vec![1; n];
182-
for i in 0..n {
183-
for j in 0..i {
184-
if pairs[i][0] > pairs[j][1] {
185-
dp[i] = dp[i].max(dp[j] + 1);
186-
}
187-
}
188-
}
189-
dp[n - 1]
190-
}
191-
}
192-
```
193-
194-
<!-- tabs:end -->
195-
196-
<!-- solution:end -->
197-
198-
<!-- solution:start -->
199-
200-
### 方法二:贪心
201-
202-
在所有可作为下一个数对的集合中,选择第二个数最小的数对添加到数对链。因此可以按照第二个数升序排列的顺序遍历所有数对,如果当前数能加入链,则加入。
69+
遍历结束后,返回答案即可。
20370

204-
时间复杂度 $O(n\log n)$。
71+
时间复杂度 $O(n \times \log n)$,空间复杂度 $O(\log n)$。其中 $n$ 为数对的数量
20572

20673
<!-- tabs:start -->
20774

@@ -210,11 +77,12 @@ impl Solution {
21077
```python
21178
class Solution:
21279
def findLongestChain(self, pairs: List[List[int]]) -> int:
213-
ans, cur = 0, -inf
214-
for a, b in sorted(pairs, key=lambda x: x[1]):
215-
if cur < a:
216-
cur = b
80+
pairs.sort(key=lambda x: x[1])
81+
ans, pre = 0, -inf
82+
for a, b in pairs:
83+
if pre < a:
21784
ans += 1
85+
pre = b
21886
return ans
21987
```
22088

@@ -223,13 +91,12 @@ class Solution:
22391
```java
22492
class Solution {
22593
public int findLongestChain(int[][] pairs) {
226-
Arrays.sort(pairs, Comparator.comparingInt(a -> a[1]));
227-
int ans = 0;
228-
int cur = Integer.MIN_VALUE;
229-
for (int[] p : pairs) {
230-
if (cur < p[0]) {
231-
cur = p[1];
94+
Arrays.sort(pairs, (a, b) -> Integer.compare(a[1], b[1]));
95+
int ans = 0, pre = Integer.MIN_VALUE;
96+
for (var p : pairs) {
97+
if (pre < p[0]) {
23298
++ans;
99+
pre = p[1];
233100
}
234101
}
235102
return ans;
@@ -243,13 +110,11 @@ class Solution {
243110
class Solution {
244111
public:
245112
int findLongestChain(vector<vector<int>>& pairs) {
246-
sort(pairs.begin(), pairs.end(), [](vector<int>& a, vector<int> b) {
247-
return a[1] < b[1];
248-
});
249-
int ans = 0, cur = INT_MIN;
250-
for (auto& p : pairs) {
251-
if (cur < p[0]) {
252-
cur = p[1];
113+
ranges::sort(pairs, {}, [](const auto& p) { return p[1]; });
114+
int ans = 0, pre = INT_MIN;
115+
for (const auto& p : pairs) {
116+
if (pre < p[0]) {
117+
pre = p[1];
253118
++ans;
254119
}
255120
}
@@ -261,18 +126,16 @@ public:
261126
#### Go
262127
263128
```go
264-
func findLongestChain(pairs [][]int) int {
265-
sort.Slice(pairs, func(i, j int) bool {
266-
return pairs[i][1] < pairs[j][1]
267-
})
268-
ans, cur := 0, math.MinInt32
129+
func findLongestChain(pairs [][]int) (ans int) {
130+
sort.Slice(pairs, func(i, j int) bool { return pairs[i][1] < pairs[j][1] })
131+
pre := math.MinInt
269132
for _, p := range pairs {
270-
if cur < p[0] {
271-
cur = p[1]
133+
if pre < p[0] {
272134
ans++
135+
pre = p[1]
273136
}
274137
}
275-
return ans
138+
return
276139
}
277140
```
278141

@@ -281,15 +144,14 @@ func findLongestChain(pairs [][]int) int {
281144
```ts
282145
function findLongestChain(pairs: number[][]): number {
283146
pairs.sort((a, b) => a[1] - b[1]);
284-
let res = 0;
285-
let pre = -Infinity;
147+
let [ans, pre] = [0, -Infinity];
286148
for (const [a, b] of pairs) {
287149
if (pre < a) {
150+
++ans;
288151
pre = b;
289-
res++;
290152
}
291153
}
292-
return res;
154+
return ans;
293155
}
294156
```
295157

@@ -298,18 +160,17 @@ function findLongestChain(pairs: number[][]): number {
298160
```rust
299161
impl Solution {
300162
pub fn find_longest_chain(mut pairs: Vec<Vec<i32>>) -> i32 {
301-
pairs.sort_by(|a, b| a[1].cmp(&b[1]));
302-
let mut res = 0;
163+
pairs.sort_by_key(|pair| pair[1]);
164+
let mut ans = 0;
303165
let mut pre = i32::MIN;
304-
for pair in pairs.iter() {
305-
let a = pair[0];
306-
let b = pair[1];
166+
for pair in pairs {
167+
let (a, b) = (pair[0], pair[1]);
307168
if pre < a {
169+
ans += 1;
308170
pre = b;
309-
res += 1;
310171
}
311172
}
312-
res
173+
ans
313174
}
314175
}
315176
```

0 commit comments

Comments
 (0)