826. Most Profit Assigning Work

package LeetCode_826

/**
 * 826. Most Profit Assigning Work
 * https://leetcode.com/problems/most-profit-assigning-work/description/
 *
 * We have jobs: difficulty[i] is the difficulty of the ith job, and profit[i] is the profit of the ith job. Now we have some workers.
 * worker[i] is the ability of the ith worker, which means that this worker can only complete a job with difficulty at most worker[i].
Every worker can be assigned at most one job, but one job can be completed multiple times.
For example, if 3 people attempt the same job that pays $1, then the total profit will be $3.
If a worker cannot complete any job, his profit is $0.
What is the most profit we can make?

Example 1:
Input: difficulty = [2,4,6,8,10], profit = [10,20,30,40,50], worker = [4,5,6,7]
Output: 100
Explanation: Workers are assigned jobs of difficulty [4,4,6,6] and they get profit of [20,20,30,30] seperately.

Notes:
1 <= difficulty.length = profit.length <= 10000
1 <= worker.length <= 10000
difficulty[i], profit[i], worker[i]  are in range [1, 10^5]
 * */
class Solution {
    /*
    * solution: Greedy, Time complexity:O(nlogn), Space complexity:O(n)
    * */
    fun maxProfitAssignment(difficulty: IntArray, profit: IntArray, worker: IntArray): Int {
        val n = difficulty.size
        //define Pair of array,
        //for Pair, first:difficulty, second:profit; and keep track the max profile so far.
        val jobs = Array<Pair<Int, Int>>(n, { Pair(0, 0) })
        for (i in 0 until n) {
            jobs[i] = Pair(difficulty[i], profit[i])
        }
        //sort the jobs by difficulty increasing
        jobs.sortWith(Comparator { a, b -> a.first - b.first })
        //sort the worker
        worker.sort()
        var i = 0
        //current best profit
        var best = 0
        var answer = 0
        for (level in worker) {
            //keep tracking current worker how many profit can make and update the result
            while (i < n && level >= jobs[i].first) {
                best = Math.max(best, jobs[i++].second)
            }
            answer += best
        }
        return answer
    }
}

 

posted @ 2020-08-08 14:30  johnny_zhao  阅读(99)  评论(0编辑  收藏  举报