826. Most Profit Assigning Work

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 {
    public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) {
        int total = 0;
        for (int i = 0; i < worker.length; ++ i){
            int curMax = 0;
            for (int j  = 0; j < difficulty.length; ++ j){
                if (worker[i] >= difficulty[j]){
                    curMax = Math.max(curMax, profit[j]);
                }
            }
            total += curMax;
        }
        return total;
    }
}

改进方法,程序如下所示:

class Solution {
    public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) {
        int total = 0;
        int len = profit.length;
        Point[] p = new Point[len];
        for (int i = 0; i < profit.length; ++ i){
            p[i] = new Point(difficulty[i], profit[i]);
        }
        Arrays.sort(p, new Comparator<Point>(){
            @Override
            public int compare(Point a, Point b){
                if (a.x != b.x){
                    return a.x - b.x;
                }
                return a.y - b.y;
            }
        });
        Arrays.sort(worker);
        for (int i = 0; i < worker.length; ++ i){
            int j = 0, curMax = 0;
            while (j < profit.length && worker[i] >= p[j].x){
                curMax = Math.max(curMax, p[j].y);
                ++ j;
            }
            total += curMax;
        }
        return total;
    }
}

你可能感兴趣的:(LeetCode)