LeetCode 1235 规划兼职工作[动态规划 二分查找] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1235 规划兼职工作[动态规划 二分查找] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。


解题思路:
一道非常实用的动态规划题型,首先将时间信息、利润放入同一数组中,数组中每一项就代表每份工作的三个属性,按照结束时间对数组进行排序,同时也对结束数组进行从小到大排序,这里为什么不按照开始时间进行排序呢?因为按照结束时间,我能保证当前遍历的工作时,之前的工作都已经结束了,至于能不能兼职,再判断就好了, 但是按照开始时间,不能保证之前工作是否结束,到头来还是要拿前一个工作结束时间和当前工作开始时间比较,得不偿失。接着定义dp数组,dp[i]表示前i份工作最大利润,按照结束顺序遍历n个工作,找当前工作之前满足end条件的工作,这里用二分查找更加方便,用dp[i] = max(dp[i - 1], dp[t] + p);更新dp数组,最后返回dp[n],代码如下:

class Solution 
public:
    int jobScheduling(vector<int>& st, vector<int>& et, vector<int>& profit) 
        int n = st.size();
        vector<vector<int>> jobs;
        for(int i = 0; i < n; i ++) 
            jobs.push_back(et[i], st[i], profit[i]);
        
        sort(jobs.begin(), jobs.end());
        sort(et.begin(), et.end());
        vector<int> dp(n + 1);
        for(int i = 1; i <= n; i ++) 
            int s = jobs[i - 1][1], p = jobs[i - 1][2];
            int t = upper_bound(et.begin(), et.end(), s) - et.begin();
            dp[i] = max(dp[i - 1], dp[t] + p);
        
        return dp[n];
    
;

以上是关于LeetCode 1235 规划兼职工作[动态规划 二分查找] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1235. 规划兼职工作

[leetcode 周赛 159] 1235 规划兼职工作

leetcode-159周赛-5233-规划兼职工作

数据结构与算法之深入解析“规划兼职工作”的求解思路与算法示例

动态规划_leetcode62

算法动态规划 ③ ( LeetCode 62.不同路径 | 问题分析 | 自顶向下的动态规划 | 自底向上的动态规划 )