Activity Selection
Problem Statement
Given start and finish times of activities, select the maximum number of non-overlapping activities. This easy-level greedy problem is about scheduling—fit in as many tasks as possible!
Example
Input: start = [1, 3, 0, 5], finish = [4, 5, 6, 7]
Output: 3 ([1,4], [5,7], [0,6])
Input: start = [1, 2], finish = [2, 3]
Output: 2
Code
Java
Python
JavaScript
public class Solution { public int activitySelection(int[] start, int[] finish) { int[][] activities = new int[start.length][2]; for (int i = 0; i < start.length; i++) { activities[i][0] = start[i]; activities[i][1] = finish[i]; } Arrays.sort(activities, (a, b) -> Integer.compare(a[1], b[1])); int count = 1; int lastEnd = activities[0][1]; for (int i = 1; i < activities.length; i++) { if (activities[i][0] >= lastEnd) { count++; lastEnd = activities[i][1]; } } return count; } }
def activity_selection(start, finish): activities = sorted(zip(start, finish), key=lambda x: x[1]) count = 1 last_end = activities[0][1] for i in range(1, len(activities)): if activities[i][0] >= last_end: count += 1 last_end = activities[i][1] return count
function activitySelection(start, finish) { let activities = start.map((s, i) => [s, finish[i]]); activities.sort((a, b) => a[1] - b[1]); let count = 1; let lastEnd = activities[0][1]; for (let i = 1; i < activities.length; i++) { if (activities[i][0] >= lastEnd) { count++; lastEnd = activities[i][1]; } } return count; }
Explanation
- Greedy Choice: Sort by finish time, select earliest-ending activity.
- Flow: Pick next activity if it starts after the last end.
- Example: [1,4],[3,5],[0,6],[5,7] → [1,4],[5,7].
Note
Time complexity: O(n log n), Space complexity: O(n). Maximize your schedule!