import java.util.*; class Activity { int start, finish; Activity(int s, int f) { start = s; finish = f; } } public class Main { public static void main(String[] args) { Activity[] activities = { new Activity(1, 4), new Activity(3, 5), new Activity(0, 6), new Activity(5, 7), new Activity(8, 9), new Activity(5, 9) }; Arrays.sort(activities, Comparator.comparingInt(a -> a.finish)); int count = 1; int lastFinish = activities[0].finish; StringBuilder selected = new StringBuilder("1"); for (int i = 1; i < activities.length; i++) { if (activities[i].start >= lastFinish) { count++; lastFinish = activities[i].finish; selected.append(" -> ").append(i + 1); } } System.out.println(selected.toString() + " -> null"); } }
The code sorts activities by their finish time. It picks the first activity (index 0). Then it selects the next activity whose start time is >= last selected finish time. The selected activities are 1 (index 0), 4 (index 3), and 5 (index 4).
The greedy approach picks the activity that finishes earliest to leave room for more activities later. This ensures the maximum number of non-overlapping activities.
import java.util.*; class Activity { int start, finish; Activity(int s, int f) { start = s; finish = f; } } public class Main { public static void main(String[] args) { Activity[] activities = { new Activity(1, 4), new Activity(3, 5), new Activity(0, 6) }; Arrays.sort(activities, (a, b) -> a.start - b.finish); System.out.println("Sorted activities"); } }
The comparator subtracts a.start - b.finish which mixes start and finish times incorrectly. This can cause inconsistent ordering and runtime exceptions.
Sorted by finish time: (1,3), (2,5), (4,7), (6,9), (8,10). Select (1,3), then (4,7), then (8,10). Maximum is 3.
import java.util.*; class Activity { int start, finish; Activity(int s, int f) { start = s; finish = f; } } public class Main { static void recursiveSelect(Activity[] acts, int k, int n) { int m = k + 1; while (m < n && acts[m].start < acts[k].finish) m++; if (m < n) { System.out.print((m + 1) + " -> "); recursiveSelect(acts, m, n); } } public static void main(String[] args) { Activity[] activities = { new Activity(1, 2), new Activity(3, 4), new Activity(0, 6), new Activity(5, 7), new Activity(8, 9), new Activity(5, 9) }; Arrays.sort(activities, Comparator.comparingInt(a -> a.finish)); System.out.print("1 -> "); recursiveSelect(activities, 0, activities.length); System.out.println("null"); } }
The recursive method picks activities by finding the next activity starting after the current one finishes. The selected activities are indices 1, 2, 4, 5 (1-based: 1,2,4,5).
