二分优化dp,LeetCode 1235. Maximum Profit in Job Scheduling

目录

一、题目

1、题目描述

2、接口描述

python3

cpp

3、原题链接

二、解题报告

1、思路分析

2、复杂度

3、代码详解

python3

cpp


一、题目

1、题目描述

We have n jobs, where every job is scheduled to be done from startTime[i] to endTime[i], obtaining a profit of profit[i].

You're given the startTime, endTime and profit arrays, return the maximum profit you can take such that there are no two jobs in the subset with overlapping time range.

If you choose a job that ends at time X you will be able to start another job that starts at time X.

2、接口描述

python3
复制代码
python 复制代码
class Solution:
    def jobScheduling(self, startTime: List[int], endTime: List[int], profit: List[int]) -> int:
cpp
复制代码
cpp 复制代码
class Solution {
public:
    int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {

    }
};

3、原题链接

1235. 规划兼职工作


二、解题报告

1、思路分析

经典区间问题,我们通常处理策略为按照某一端排序

这里按照右端点升序排序

然后定义状态 fi 为前 i 个工作所能取得的最大收益

那么fi + 1 = max(fi, fj + profiti)

即第 i 个工作选或不选,j要满足endTimej <= startTimei,这个由于我们已经按照右端点升序排序,所以可以二分查找来快速找到 j

2、复杂度

时间复杂度: O(nlogn)空间复杂度:O(n)

3、代码详解

python3
复制代码
python 复制代码
class Solution:
    def jobScheduling(self, startTime: List[int], endTime: List[int], profit: List[int]) -> int:
        p = sorted(zip(startTime, endTime, profit), key=lambda x:x[1])
        n = len(p)
        f = [0] * (n + 1)
        for i, (s, e, w) in enumerate(p):
            idx = bisect_left(p, s + 1, key=lambda x: x[1], hi = i)
            f[i + 1] = max(f[i], f[idx] + w)
        return f[n]
cpp
复制代码
cpp 复制代码
class Solution {
public:
    int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {
        int n = startTime.size();
        vector<array<int, 3>> p(n);
        for (int i = 0; i < n; i ++)
            p[i] = { startTime[i], endTime[i], profit[i] };

        sort(p.begin(), p.end(), [](const auto& a, const auto& b){
            return a[1] < b[1];
        });
        vector<int> f(n + 1);
        for (int i = 0; i < n; i ++){
            int idx = lower_bound(p.begin(), p.begin() + i, array<int, 3>{ 0, p[i][0] + 1, 0}, [](const auto& a, const auto& b){
                return a[1] < b[1];
            }) - p.begin();
            f[i + 1] = max(f[i], f[idx] + p[i][2]);
        }
        return f[n];
    }
};
相关推荐
JieE21213 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack2021 小时前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树1 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2122 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2122 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术2 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦2 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050732 天前
(一)小红的数组操作
算法·编程语言
怕浪猫2 天前
Electron 系列文章封面图
算法·架构·前端框架