Given an array of jobs where every job has a deadline and associated profit (if the job is finished before the deadline). It is also given that every job takes a single unit of time, so the minimum possible deadline for any job is 1. How to maximize total profit if only one job can be scheduled at a time.

**Examples:**

Input : Four Jobs with following deadlines and profits JobID Deadline Profit a 4 20 b 1 10 c 1 40 d 1 30 Output : Following is maximum profit sequence of jobs c, a

Input : Five Jobs with following deadlines and profits JobID Deadline Profit a 2 100 b 1 19 c 2 27 d 1 25 e 3 15 Output : Following is maximum profit sequence of jobs c, a, e

Below is the step by step algorithm to solve the problem using TreeSet in Java:

- Sort all the jobs according to their respective profits in decreasing order.
- Create a TreeSet and insert all the integers from 0 to n-1.
- Traverse the array of jobs and for i
^{th}job- Search for a time slot ‘x’ in the TreeSet with maximum value which is less than the deadline of the i
^{th}job. - If any value exists then include that job in the answer and remove ‘x’ from the TreeSet
- Else check for the remaining jobs.

- Search for a time slot ‘x’ in the TreeSet with maximum value which is less than the deadline of the i

Below is the implementation of the above algorithm:

`import` `java.io.*;` `import` `java.util.*;` ` ` `public` `class` `Solution {` ` ` ` ` `// Job class` ` ` `public` `static` `class` `Job {` ` ` `char` `id;` ` ` `int` `deadline;` ` ` `int` `profit;` ` ` ` ` `// Constructor` ` ` `Job(` `char` `id, ` `int` `deadline, ` `int` `profit)` ` ` `{` ` ` `this` `.id = id;` ` ` `this` `.deadline = deadline;` ` ` `this` `.profit = profit;` ` ` `}` ` ` `}` ` ` ` ` `public` `static` `class` `Sorted ` `implements` `Comparator {` ` ` ` ` `// Function to implement comparator` ` ` `public` `int` `compare(Object o1, Object o2)` ` ` `{` ` ` `Job j1 = (Job)o1;` ` ` `Job j2 = (Job)o2;` ` ` ` ` `if` `(j1.profit != j2.profit)` ` ` `return` `j2.profit - j1.profit;` ` ` `else` ` ` `return` `j2.deadline - j1.deadline;` ` ` `}` ` ` `}` ` ` ` ` `// Function to print job scheduling` ` ` `public` `static` `void` `printJobScheduling(Job jobs[], ` `int` `n)` ` ` `{` ` ` `// Creating object of Sorted class` ` ` `Sorted sorter = ` `new` `Sorted();` ` ` ` ` `Arrays.sort(jobs, sorter);` ` ` ` ` `// Creating TreeSet Object` ` ` `TreeSet<Integer> ts = ` `new` `TreeSet<>();` ` ` ` ` `for` `(` `int` `i = ` `0` `; i < n; i++)` ` ` `ts.add(i);` ` ` ` ` `for` `(` `int` `i = ` `0` `; i < n; i++) {` ` ` `Integer x = ts.floor(jobs[i].deadline - ` `1` `);` ` ` ` ` `if` `(x != ` `null` `) {` ` ` `System.out.print(jobs[i].id + ` `" "` `);` ` ` `ts.remove(x);` ` ` `}` ` ` `}` ` ` `}` ` ` ` ` `// Driver Code` ` ` `public` `static` `void` `main(String[] args)` ` ` `{` ` ` `int` `n = ` `5` `;` ` ` `Job[] jobs = ` `new` `Job[n];` ` ` ` ` `jobs[` `0` `] = ` `new` `Job(` `'a'` `, ` `2` `, ` `100` `);` ` ` `jobs[` `1` `] = ` `new` `Job(` `'b'` `, ` `1` `, ` `19` `);` ` ` `jobs[` `2` `] = ` `new` `Job(` `'c'` `, ` `2` `, ` `27` `);` ` ` `jobs[` `3` `] = ` `new` `Job(` `'d'` `, ` `1` `, ` `25` `);` ` ` `jobs[` `4` `] = ` `new` `Job(` `'e'` `, ` `3` `, ` `15` `);` ` ` ` ` `printJobScheduling(jobs, n);` ` ` `}` ` ` `// Contributed by Dipesh Jain (dipesh_jain)` `}` |

**Time Complexity**: O(N*log(N))**Auxiliary Space**: O(N)

Attention reader! Don’t stop learning now. Get hold of all the important **Java Foundation** and Collections concepts with the **Fundamentals of Java and Java Collections Course** at a student-friendly price and become industry ready. To complete your preparation from learning a language to DS Algo and many more, please refer **Complete Interview Preparation Course****.**