LeetCode1235:规划兼职工作

2020-02-24  本文已影响0人  啊啊啊哼哼哼

题目描述:https://leetcode-cn.com/problems/maximum-profit-in-job-scheduling/

我的踩坑经历

正确的解题思路

最后问题还是出在动态规划,重写定义动态规划的状态表示:
f[i]:前i个工作能获得的最大的报酬;
另开一个w[i] 数组记录,某个工作 j 的结束时间距离第i的工作的开始时间最近,返回工作索引 j, 不存在就返回-1。

if(w[i] == -1){ f[i] = Math.max(f[i-1], profile[i]);}
else f[i] = Math.max(f[i-1], f[w[i]]+profile[i]);

详细代码:

class Solution {
     private static void quickSort(int[] arry, int []arry1, int [] arry2, int l, int r) {
        if(r<=l) return;
        int x = arry[(l+r)/2];
        int i = l-1;
        int j = r+1;
        while(i<j){
            do i++; while(arry[i]<x);
            do j--; while(arry[j]>x);
            if(i<j){
                int tmp = arry[i];
                arry[i] = arry[j];
                arry[j] = tmp;

                tmp = arry1[i];
                arry1[i] = arry1[j];
                arry1[j] = tmp;

                tmp = arry2[i];
                arry2[i] = arry2[j];
                arry2[j] = tmp;
            }
        }
        quickSort(arry,arry1,arry2, l,j);
        quickSort(arry,arry1, arry2,j+1,r);
    }
    public int jobScheduling(int[] startTime, int[] endTime, int[] profit) {
        int n = startTime.length;
        if(n== 0) return 0;
        if(n== 1) return profit[0];
        quickSort(endTime, startTime, profit, 0,n-1);

        int[] w = new int[n];
        int[] results = new int[n];
        for(int i = 1;i<n;i++){
            //找第i个作业的开始时间距离最近的某个作业的结束时间,返回这个作业的结束时间
            int j = i-1;
            while(j>=0 && endTime[j]>startTime[i]){
                j--;
            }
            w[i] = j;
        }
        results[0] = profit[0];
        int max = results[0];
        for(int i = 1;i<n;i++){
            if(w[i] == -1){
                results[i] = Math.max(results[i-1], profit[i]);
            }
            else{
                results[i] = Math.max(results[i-1], results[w[i]]+profit[i]);
            }

        }
        return results[n-1];
    }
}
结果.png
上一篇 下一篇

猜你喜欢

热点阅读