-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathActivitySelection.java
More file actions
177 lines (142 loc) · 5.21 KB
/
ActivitySelection.java
File metadata and controls
177 lines (142 loc) · 5.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
import java.util.*;
/*
*
* 活动选择问题 - 选择最多数量的相容活动
*
* 算法:
* - 给定一组带有开始时间和结束时间的活动
* - 选择数量最多的互不重叠活动
* - 策略:按结束时间排序,然后贪心地选择活动
*
* 时间复杂度:O(n log n)(排序)
* 空间复杂度:O(n)(存储结果)
*
* 关键思想:
* 总是优先选择结束时间最早的活动,可以为后续活动留下最多空间,
* 这一贪心选择可以得到最优解。
*/
class Activity implements Comparable<Activity> {
int id;
int start;
int end;
Activity(int id, int start, int end) {
this.id = id;
this.start = start;
this.end = end;
}
@Override
public int compareTo(Activity other) {
return Integer.compare(this.end, other.end);
}
@Override
public String toString() {
return "Activity(" + id + ": [" + start + ", " + end + "])";
}
}
public class ActivitySelection {
/*
* 选择最多数量的不重叠活动
*
* @param activities 活动列表
* @return 选中的活动列表
*/
static List<Activity> selectActivities(List<Activity> activities) {
if (activities.isEmpty()) {
return new ArrayList<>();
}
// 按结束时间排序(贪心选择)
Collections.sort(activities);
List<Activity> selected = new ArrayList<>();
selected.add(activities.get(0));
int lastEndTime = activities.get(0).end;
// 贪心选择剩余的活动
for (int i = 1; i < activities.size(); i++) {
Activity current = activities.get(i);
if (current.start >= lastEndTime) {
selected.add(current);
lastEndTime = current.end;
}
}
return selected;
}
static void testBasicExample() {
System.out.println("\n[Test 1] Basic example with overlapping activities");
List<Activity> activities = Arrays.asList(
new Activity(1, 1, 3),
new Activity(2, 2, 5),
new Activity(3, 4, 6),
new Activity(4, 6, 7),
new Activity(5, 5, 8),
new Activity(6, 8, 9)
);
List<Activity> selected = selectActivities(activities);
System.out.println("Input activities: " + activities);
System.out.println("Selected activities: " + selected);
System.out.println("Count: " + selected.size());
}
static void testAllCompatible() {
System.out.println("\n[Test 2] All activities compatible (non-overlapping)");
List<Activity> activities = Arrays.asList(
new Activity(1, 1, 2),
new Activity(2, 2, 3),
new Activity(3, 3, 4),
new Activity(4, 4, 5)
);
List<Activity> selected = selectActivities(activities);
System.out.println("Selected activities: " + selected);
System.out.println("Count: " + selected.size());
}
static void testAllOverlapping() {
System.out.println("\n[Test 3] All activities overlapping");
List<Activity> activities = Arrays.asList(
new Activity(1, 1, 10),
new Activity(2, 2, 9),
new Activity(3, 3, 8),
new Activity(4, 4, 7)
);
List<Activity> selected = selectActivities(activities);
System.out.println("Selected activities: " + selected);
System.out.println("Count: " + selected.size());
}
static void testSingleActivity() {
System.out.println("\n[Test 4] Single activity");
List<Activity> activities = Collections.singletonList(
new Activity(1, 5, 10)
);
List<Activity> selected = selectActivities(activities);
System.out.println("Selected activities: " + selected);
System.out.println("Count: " + selected.size());
}
static void testEmpty() {
System.out.println("\n[Test 5] Empty input");
List<Activity> activities = new ArrayList<>();
List<Activity> selected = selectActivities(activities);
System.out.println("Selected activities: " + selected);
System.out.println("Count: " + selected.size());
}
static void testComplexScheduling() {
System.out.println("\n[Test 6] Complex scheduling scenario");
List<Activity> activities = Arrays.asList(
new Activity(1, 0, 6),
new Activity(2, 1, 4),
new Activity(3, 3, 5),
new Activity(4, 5, 7),
new Activity(5, 8, 9),
new Activity(6, 5, 9)
);
List<Activity> selected = selectActivities(activities);
System.out.println("Selected activities: " + selected);
System.out.println("Count: " + selected.size());
}
public static void main(String[] args) {
System.out.println("==================================================");
System.out.println("ACTIVITY SELECTION - Greedy Algorithm (Java)");
System.out.println("==================================================");
testBasicExample();
testAllCompatible();
testAllOverlapping();
testSingleActivity();
testEmpty();
testComplexScheduling();
}
}