Skip to content

Commit d27ca9b

Browse files
committed
Add solution 1353
1 parent 6fcc9ec commit d27ca9b

24 files changed

+577
-238
lines changed

README.md

Lines changed: 175 additions & 170 deletions
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package leetcode
2+
3+
import (
4+
"sort"
5+
)
6+
7+
func maxEvents(events [][]int) int {
8+
sort.Slice(events, func(i, j int) bool {
9+
if events[i][0] == events[j][0] {
10+
return events[i][1] < events[j][1]
11+
}
12+
return events[i][0] < events[j][0]
13+
})
14+
attended, current := 1, events[0]
15+
for i := 1; i < len(events); i++ {
16+
prev, event := events[i-1], events[i]
17+
if event[0] == prev[0] && event[1] == prev[1] && event[1] == event[0] {
18+
continue
19+
}
20+
start, end := max(current[0], event[0]-1), max(current[1], event[1])
21+
if end-start > 0 {
22+
current[0] = start + 1
23+
current[1] = end
24+
attended++
25+
}
26+
}
27+
return attended
28+
}
29+
30+
func max(a, b int) int {
31+
if a > b {
32+
return a
33+
}
34+
return b
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package leetcode
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
)
7+
8+
type question1353 struct {
9+
para1353
10+
ans1353
11+
}
12+
13+
// para 是参数
14+
// one 代表第一个参数
15+
type para1353 struct {
16+
events [][]int
17+
}
18+
19+
// ans 是答案
20+
// one 代表第一个答案
21+
type ans1353 struct {
22+
one int
23+
}
24+
25+
func Test_Problem1353(t *testing.T) {
26+
27+
qs := []question1353{
28+
29+
{
30+
para1353{[][]int{{1, 2}, {2, 3}, {3, 4}}},
31+
ans1353{3},
32+
},
33+
34+
{
35+
para1353{[][]int{{1, 4}, {4, 4}, {2, 2}, {3, 4}, {1, 1}}},
36+
ans1353{4},
37+
},
38+
39+
{
40+
para1353{[][]int{{1, 100000}}},
41+
ans1353{1},
42+
},
43+
44+
{
45+
para1353{[][]int{{1, 1}, {2, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}, {1, 7}}},
46+
ans1353{7},
47+
},
48+
49+
{
50+
para1353{[][]int{{1, 2}, {2, 2}, {3, 3}, {3, 4}, {3, 4}}},
51+
ans1353{4},
52+
},
53+
54+
{
55+
para1353{[][]int{{1, 10}, {2, 2}, {2, 2}, {2, 2}, {2, 2}}},
56+
ans1353{2},
57+
},
58+
}
59+
60+
fmt.Printf("------------------------Leetcode Problem 1353------------------------\n")
61+
62+
for _, q := range qs {
63+
_, p := q.ans1353, q.para1353
64+
fmt.Printf("【input】:%v 【output】:%v\n", p, maxEvents(p.events))
65+
}
66+
fmt.Printf("\n\n\n")
67+
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# [1353. Maximum Number of Events That Can Be Attended](https://leetcode.com/problems/maximum-number-of-events-that-can-be-attended/)
2+
3+
4+
## 题目
5+
6+
Given an array of `events` where `events[i] = [startDayi, endDayi]`. Every event `i` starts at `startDayi` and ends at `endDayi`.
7+
8+
You can attend an event `i` at any day `d` where `startTimei <= d <= endTimei`. Notice that you can only attend one event at any time `d`.
9+
10+
Return *the maximum number of events* you can attend.
11+
12+
**Example 1:**
13+
14+
![https://assets.leetcode.com/uploads/2020/02/05/e1.png](https://assets.leetcode.com/uploads/2020/02/05/e1.png)
15+
16+
```
17+
Input: events = [[1,2],[2,3],[3,4]]
18+
Output: 3
19+
Explanation: You can attend all the three events.
20+
One way to attend them all is as shown.
21+
Attend the first event on day 1.
22+
Attend the second event on day 2.
23+
Attend the third event on day 3.
24+
25+
```
26+
27+
**Example 2:**
28+
29+
```
30+
Input: events= [[1,2],[2,3],[3,4],[1,2]]
31+
Output: 4
32+
33+
```
34+
35+
**Example 3:**
36+
37+
```
38+
Input: events = [[1,4],[4,4],[2,2],[3,4],[1,1]]
39+
Output: 4
40+
41+
```
42+
43+
**Example 4:**
44+
45+
```
46+
Input: events = [[1,100000]]
47+
Output: 1
48+
49+
```
50+
51+
**Example 5:**
52+
53+
```
54+
Input: events = [[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7]]
55+
Output: 7
56+
57+
```
58+
59+
**Constraints:**
60+
61+
- `1 <= events.length <= 10^5`
62+
- `events[i].length == 2`
63+
- `1 <= startDayi <= endDayi <= 10^5`
64+
65+
## 题目大意
66+
67+
给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。请你返回你可以参加的 最大 会议数目。
68+
69+
## 解题思路
70+
71+
- 关于会议安排,活动安排这类题,第一直觉是贪心问题。先按照会议开始时间从小到大排序,如果开始时间相同,再按照结束时间从小到大排序。贪心策略是,优先选择参加早结束的会议。因为一个结束时间晚的会议,代表这个会议持续时间长,先参加马上要结束的会议,这样可以参加更多的会议。
72+
- 注意题目给的数据代表的是天数。比较大小的时候最好转换成坐标轴上的坐标点。例如 [1,2] 代表这个会议持续 2 天,如果在坐标轴上表示,是 [0,2],0-1 表示第一天,1-2 表示第二天。所以比较会议时需要把开始时间减一。选定了这个会议以后记得要把这一天排除,例如选择了第二天,那么下次对比起始时间需要从坐标 2 开始,因为第二天的时间范围是 1-2,所以下一轮比较会议前需要把开始时间加一。从左往右依次扫描各个会议时间段,选择结束时间大于起始时间的会议,不断累加次数,扫描完所有会议,最终结果即为可参加的最大会议数。
73+
- 测试数据中有一组很恶心的数据,见 test 文件中最后一组数据。这组数据在同一天叠加了多个会议,并且起始时间完全一致。这种特殊情况需要加判断条件排除,见下面代码 continue 条件。
74+
75+
## 代码
76+
77+
```go
78+
package leetcode
79+
80+
import (
81+
"sort"
82+
)
83+
84+
func maxEvents(events [][]int) int {
85+
sort.Slice(events, func(i, j int) bool {
86+
if events[i][0] == events[j][0] {
87+
return events[i][1] < events[j][1]
88+
}
89+
return events[i][0] < events[j][0]
90+
})
91+
attended, current := 1, events[0]
92+
for i := 1; i < len(events); i++ {
93+
prev, event := events[i-1], events[i]
94+
if event[0] == prev[0] && event[1] == prev[1] && event[1] == event[0] {
95+
continue
96+
}
97+
start, end := max(current[0], event[0]-1), max(current[1], event[1])
98+
if end-start > 0 {
99+
current[0] = start + 1
100+
current[1] = end
101+
attended++
102+
}
103+
}
104+
return attended
105+
}
106+
107+
func max(a, b int) int {
108+
if a > b {
109+
return a
110+
}
111+
return b
112+
}
113+
```

website/content/ChapterFour/1300~1399/1337.The-K-Weakest-Rows-in-a-Matrix.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,5 +93,5 @@ func kWeakestRows(mat [][]int, k int) []int {
9393
----------------------------------------------
9494
<div style="display: flex;justify-content: space-between;align-items: center;">
9595
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/1300~1399/1332.Remove-Palindromic-Subsequences/">⬅️上一页</a></p>
96-
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/1300~1399/1380.Lucky-Numbers-in-a-Matrix/">下一页➡️</a></p>
96+
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/1300~1399/1353.Maximum-Number-of-Events-That-Can-Be-Attended/">下一页➡️</a></p>
9797
</div>
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# [1353. Maximum Number of Events That Can Be Attended](https://leetcode.com/problems/maximum-number-of-events-that-can-be-attended/)
2+
3+
4+
## 题目
5+
6+
Given an array of `events` where `events[i] = [startDayi, endDayi]`. Every event `i` starts at `startDayi` and ends at `endDayi`.
7+
8+
You can attend an event `i` at any day `d` where `startTimei <= d <= endTimei`. Notice that you can only attend one event at any time `d`.
9+
10+
Return *the maximum number of events* you can attend.
11+
12+
**Example 1:**
13+
14+
![https://assets.leetcode.com/uploads/2020/02/05/e1.png](https://assets.leetcode.com/uploads/2020/02/05/e1.png)
15+
16+
```
17+
Input: events = [[1,2],[2,3],[3,4]]
18+
Output: 3
19+
Explanation: You can attend all the three events.
20+
One way to attend them all is as shown.
21+
Attend the first event on day 1.
22+
Attend the second event on day 2.
23+
Attend the third event on day 3.
24+
25+
```
26+
27+
**Example 2:**
28+
29+
```
30+
Input: events= [[1,2],[2,3],[3,4],[1,2]]
31+
Output: 4
32+
33+
```
34+
35+
**Example 3:**
36+
37+
```
38+
Input: events = [[1,4],[4,4],[2,2],[3,4],[1,1]]
39+
Output: 4
40+
41+
```
42+
43+
**Example 4:**
44+
45+
```
46+
Input: events = [[1,100000]]
47+
Output: 1
48+
49+
```
50+
51+
**Example 5:**
52+
53+
```
54+
Input: events = [[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7]]
55+
Output: 7
56+
57+
```
58+
59+
**Constraints:**
60+
61+
- `1 <= events.length <= 10^5`
62+
- `events[i].length == 2`
63+
- `1 <= startDayi <= endDayi <= 10^5`
64+
65+
## 题目大意
66+
67+
给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。请你返回你可以参加的 最大 会议数目。
68+
69+
## 解题思路
70+
71+
- 关于会议安排,活动安排这类题,第一直觉是贪心问题。先按照会议开始时间从小到大排序,如果开始时间相同,再按照结束时间从小到大排序。贪心策略是,优先选择参加早结束的会议。因为一个结束时间晚的会议,代表这个会议持续时间长,先参加马上要结束的会议,这样可以参加更多的会议。
72+
- 注意题目给的数据代表的是天数。比较大小的时候最好转换成坐标轴上的坐标点。例如 [1,2] 代表这个会议持续 2 天,如果在坐标轴上表示,是 [0,2],0-1 表示第一天,1-2 表示第二天。所以比较会议时需要把开始时间减一。选定了这个会议以后记得要把这一天排除,例如选择了第二天,那么下次对比起始时间需要从坐标 2 开始,因为第二天的时间范围是 1-2,所以下一轮比较会议前需要把开始时间加一。从左往右依次扫描各个会议时间段,选择结束时间大于起始时间的会议,不断累加次数,扫描完所有会议,最终结果即为可参加的最大会议数。
73+
- 测试数据中有一组很恶心的数据,见 test 文件中最后一组数据。这组数据在同一天叠加了多个会议,并且起始时间完全一致。这种特殊情况需要加判断条件排除,见下面代码 continue 条件。
74+
75+
## 代码
76+
77+
```go
78+
package leetcode
79+
80+
import (
81+
"sort"
82+
)
83+
84+
func maxEvents(events [][]int) int {
85+
sort.Slice(events, func(i, j int) bool {
86+
if events[i][0] == events[j][0] {
87+
return events[i][1] < events[j][1]
88+
}
89+
return events[i][0] < events[j][0]
90+
})
91+
attended, current := 1, events[0]
92+
for i := 1; i < len(events); i++ {
93+
prev, event := events[i-1], events[i]
94+
if event[0] == prev[0] && event[1] == prev[1] && event[1] == event[0] {
95+
continue
96+
}
97+
start, end := max(current[0], event[0]-1), max(current[1], event[1])
98+
if end-start > 0 {
99+
current[0] = start + 1
100+
current[1] = end
101+
attended++
102+
}
103+
}
104+
return attended
105+
}
106+
107+
func max(a, b int) int {
108+
if a > b {
109+
return a
110+
}
111+
return b
112+
}
113+
```
114+
115+
116+
----------------------------------------------
117+
<div style="display: flex;justify-content: space-between;align-items: center;">
118+
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/1300~1399/1337.The-K-Weakest-Rows-in-a-Matrix/">⬅️上一页</a></p>
119+
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/1300~1399/1380.Lucky-Numbers-in-a-Matrix/">下一页➡️</a></p>
120+
</div>

website/content/ChapterFour/1300~1399/1380.Lucky-Numbers-in-a-Matrix.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,6 @@ func luckyNumbers(matrix [][]int) []int {
8989

9090
----------------------------------------------
9191
<div style="display: flex;justify-content: space-between;align-items: center;">
92-
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/1300~1399/1337.The-K-Weakest-Rows-in-a-Matrix/">⬅️上一页</a></p>
92+
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/1300~1399/1353.Maximum-Number-of-Events-That-Can-Be-Attended/">⬅️上一页</a></p>
9393
<p><a href="https://books.halfrost.com/leetcode/ChapterFour/1300~1399/1385.Find-the-Distance-Value-Between-Two-Arrays/">下一页➡️</a></p>
9494
</div>

0 commit comments

Comments
 (0)