美文网首页
LeetCode1235:规划兼职工作

LeetCode1235:规划兼职工作

作者: 啊啊啊哼哼哼 | 来源:发表于2020-02-24 12:09 被阅读0次

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

我的踩坑经历

  • 每个工作带有三个属性:startTime, endTime, profile.
  • 看到这个题目,第一反应就是需要按照endTime对工作进行排序,并且这是一道动态规划的题目。
  • 这里简单记录下我写出的坑:
    1、我创建了一个类Job,为了方便endTime排序,只重写Arrays.sort()方法,这次提交显示内存溢出,我猜测重新创建对象导致大量内存的消耗;
    2、动态规划定义的状态表示过于冗余
    f[i][j]: 前 i 个工作在时间 j 之前能获得的最大报酬;
  • 状态转移方程:
    这里两点,如果 j 大于第 i 个作业的 endTime,那么
    f[i][j] = Math.max( f[i-1][j], f[i-1][startTime[i]]+profile[i]);
    如果 j 不大于第 i 个作业的endTime, 那么
    f[i][j] = f[i-1][j];
    这个n*m的二位数组也是造成内存溢出的元凶,于是我将状态表示压缩为一维数组,并且将Job类去掉,自己手写快排。然后显示time limited。

正确的解题思路

最后问题还是出在动态规划,重写定义动态规划的状态表示:
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

相关文章

  • LeetCode1235:规划兼职工作

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

  • LeetCode #1235 Maximum Profit in

    1235 Maximum Profit in Job Scheduling 规划兼职工作 Description:...

  • 兼职规划

    2019年计划初步规划 关于许愿骨,我是认真的,因为天然的产品,健康、环保、有趣。 2019一定要有新的起色,争取...

  • 琴,让我自律也让我看到更美好的自己

    最近这几年,都被我规划的很满,既要考工作,考上工作又要考研,闲暇时间不是兼职维持生活就是看书和旅行,今年又被我加上...

  • UI设计如何通过兼职月薪过万

    近期有许多学员问我,UI规划能不能做兼职, 能不能在家接单挣钱,今日就和我们说下, UI规划怎么经过兼职月薪过万兼...

  • 晨间日记(大年初五)

    1.29大年初五 工作上的小改变: 确实,工作还有其他的都需要规划与安排。 特别是我们这种在家兼职(没人管着) 一...

  • 2021-10-14

    最近在做兼职,想的是不能闲着。 在北京,没有工作,没有亲人,没有依靠,更不能闲着! 后续的时间也规划好了,按照计划...

  • 家庭时间管理

    制定好家庭收入目标。本质工作的收益、兼职工作收益等,经济基础决定上层建筑,没有解决好经济问题很难有家庭的时间规划。...

  • 永远不要把希望寄托在别人身上

    大学的时候,小米兼职是认识了秃子,那时秃子已经工作了三四年,相对自己已是成熟了不少,当时他们经常聊梦想,规划未来...

  • 自我介绍--刘安平

    1、姓名/年龄/型号/职业 大家好,我叫刘安平,年龄:44岁,理财规划师,东方九型教练学院兼职工作人员,型号:...

网友评论

      本文标题:LeetCode1235:规划兼职工作

      本文链接:https://www.haomeiwen.com/subject/plbmqhtx.html