interface Activity {
start: number;
finish: number;
}
function activitySelection(activities: Activity[]): Activity[] {
activities.sort((a, b) => a.finish - b.finish);
const selected: Activity[] = [];
let lastFinish = 0;
for (const activity of activities) {
if (activity.start >= lastFinish) {
selected.push(activity);
lastFinish = activity.finish;
}
}
return selected;
}
const activities = [
{ start: 1, finish: 4 },
{ start: 3, finish: 5 },
{ start: 0, finish: 6 },
{ start: 5, finish: 7 },
{ start: 8, finish: 9 },
{ start: 5, finish: 9 }
];
const result = activitySelection(activities);
console.log(result.map(a => `[${a.start},${a.finish}]`).join(' -> '));The greedy algorithm sorts activities by finish time and selects the earliest finishing activities that do not overlap. The selected activities are [1,4], [5,7], and [8,9].
Sorting by finish time: (1,3), (2,5), (4,7), (6,9), (8,10). Select (1,3), then (4,7), skip (6,9) because 6 < 7, then (8,10). So maximum is 3.
interface Activity {
start: number;
finish: number;
}
function activitySelection(activities: Activity[]): Activity[] {
activities.sort((a, b) => a.start - b.start);
const selected: Activity[] = [];
let lastFinish = 0;
for (const activity of activities) {
if (activity.start >= lastFinish) {
selected.push(activity);
lastFinish = activity.finish;
}
}
return selected;
}
const activities = [
{ start: 1, finish: 4 },
{ start: 3, finish: 5 },
{ start: 0, finish: 6 },
{ start: 5, finish: 7 },
{ start: 8, finish: 9 },
{ start: 5, finish: 9 }
];
const result = activitySelection(activities);
console.log(result.map(a => `[${a.start},${a.finish}]`).join(' -> '));The code sorts activities by start time instead of finish time, which breaks the greedy approach. It selects activities starting earliest but may overlap. The output is '[0,6] -> [8,9]'.
Sorted by finish time: (1,3), (2,4), (3,5), (5,7), (6,8), (8,10). Select (1,3), skip (2,4) because 2 < 3, select (3,5) because 3 >= 3, select (5,7) because 5 >= 5, skip (6,8) because 6 < 7, select (8,10).
Choosing the activity that finishes earliest leaves the largest possible time for the rest of the activities, maximizing the total number selected.