【LeetCode: 1335. 工作计划的最低难度 | 暴力递归=>记忆化搜索=>动态规划 】

news2024/11/24 6:26:41

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 暴力法
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 记忆化搜索
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
      • ⚡ 动态规划
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 1335. 工作计划的最低难度

⛲ 题目描述

你需要制定一份 d 天的工作计划表。工作之间存在依赖,要想执行第 i 项工作,你必须完成全部 j 项工作( 0 <= j < i)。

你每天 至少 需要完成一项任务。工作计划的总难度是这 d 天每一天的难度之和,而一天的工作难度是当天应该完成工作的最大难度。

给你一个整数数组 jobDifficulty 和一个整数 d,分别代表工作难度和需要计划的天数。第 i 项工作的难度是 jobDifficulty[i]。

返回整个工作计划的 最小难度 。如果无法制定工作计划,则返回 -1 。

示例 1:
在这里插入图片描述

输入:jobDifficulty = [6,5,4,3,2,1], d = 2
输出:7
解释:第一天,您可以完成前 5 项工作,总难度 = 6.
第二天,您可以完成最后一项工作,总难度 = 1.
计划表的难度 = 6 + 1 = 7
示例 2:

输入:jobDifficulty = [9,9,9], d = 4
输出:-1
解释:就算你每天完成一项工作,仍然有一天是空闲的,你无法制定一份能够满足既定工作时间的计划表。
示例 3:

输入:jobDifficulty = [1,1,1], d = 3
输出:3
解释:工作计划为每天一项工作,总难度为 3 。
示例 4:

输入:jobDifficulty = [7,1,7,1,7,1], d = 3
输出:15
示例 5:

输入:jobDifficulty = [11,111,22,222,33,333,44,444], d = 6
输出:843

提示:

1 <= jobDifficulty.length <= 300
0 <= jobDifficulty[i] <= 1000
1 <= d <= 10

🌟 求解思路&实现代码&运行结果


⚡ 暴力法

🥦 求解思路

  1. 简单概括题目的意思:将给定的所有工作任务拆分为d天,如果不能拆分,直接返回-1,如能拆分,那么需要统计一天中完成所有任务难度的最大值,最后让我们求的是d天完成所有任务的最小值。
  2. 那么题目怎么求解呢?其实和我们的背包类型的动态规划是差不多的,需要我们进一步的转换一下,我们从jobDifficulty中进行选择,一共d天,求满足题目要求,也就是完成所有任务的最小值是多少,那么递归的思路也就出来了,假设此时我们来到了cur位置,cur<jobDifficulty.length,那么 我们可以求去求解0-cur这一天的最大值,然后再去递归求解cur+1位置上d-1的最小值,题目存在重复的子问题规模,我们通过递归直接求解。
  3. 如果背包模型不清楚的同学可以看一下我之前的文章,此处不做过多的讲解。
  4. 有了基本的思路,接下来我们就来通过代码来实现一下。

🥦 实现代码

class Solution {
    
    public int minDifficulty(int[] jobDifficulty, int d) {
        if(jobDifficulty.length<d) return -1;
        return process(0,jobDifficulty,d);
    }

    public int process(int index,int[] jobDifficulty,int d){
        if(index>=jobDifficulty.length) return Integer.MAX_VALUE;
        if(d==1){
            int max=0;
            for(int i=index;i<jobDifficulty.length;i++){
                max=Math.max(max,jobDifficulty[i]);
            }
            return max;
        }
        int max=0;
        int min=Integer.MAX_VALUE;
        for(int i=index;i<jobDifficulty.length;i++){
            max=Math.max(max,jobDifficulty[i]);
            int next=process(i+1,jobDifficulty,d-1);
            if(next!=Integer.MAX_VALUE) min=Math.min(max+next,min);
        }
        return min;
    }
}

🥦 运行结果

超时了,可以接受,是我们期待的结果。

在这里插入图片描述


⚡ 记忆化搜索

🥦 求解思路

  1. 因为在递归的过程中,会重复的出现一些多次计算的结果,我们通过开辟一个数组,将结果提前缓存下来,算过的直接返回,避免重复计算,通过空间来去换我们的时间。

🥦 实现代码

class Solution {
    
    int[][] dp;

    public int minDifficulty(int[] jobDifficulty, int d) {
        if(jobDifficulty.length<d) return -1;
        dp=new int[jobDifficulty.length][d+1];
        for(int i=0;i<jobDifficulty.length;i++) Arrays.fill(dp[i],-1);
        return process(0,jobDifficulty,d);
    }

    public int process(int index,int[] jobDifficulty,int d){
        if(index>=jobDifficulty.length) return Integer.MAX_VALUE;
        if(d==1){
            int max=0;
            for(int i=index;i<jobDifficulty.length;i++){
                max=Math.max(max,jobDifficulty[i]);
            }
            return dp[index][d]=max;
        }
        if(dp[index][d]!=-1) return dp[index][d];
        int max=0;
        int min=Integer.MAX_VALUE;
        for(int i=index;i<jobDifficulty.length;i++){
            max=Math.max(max,jobDifficulty[i]);
            int next=process(i+1,jobDifficulty,d-1);
            if(next!=Integer.MAX_VALUE) min=Math.min(max+next,min);
        }
        return dp[index][d]=min;
    }
}

🥦 运行结果

通过缓存,将重复计算的结果缓存下来,通过。
在这里插入图片描述


⚡ 动态规划

🥦 求解思路

  1. 有了递归,有了记忆化搜索,接下来就是动态规划了,直接上手。

🥦 实现代码

class Solution {
    
    int[][] dp;

    public int minDifficulty(int[] jobDifficulty, int target) {
        if(jobDifficulty.length<target) return -1;
        dp=new int[jobDifficulty.length+1][target+1];
        for(int i=0;i<dp.length;i++) Arrays.fill(dp[i],Integer.MAX_VALUE);
        for(int index=jobDifficulty.length-1;index>=0;index--){
            int max=0;
            for(int i=index;i<jobDifficulty.length;i++){
                max=Math.max(max,jobDifficulty[i]);
            }
            dp[index][1]=max;
        }
        for(int index=jobDifficulty.length-2;index>=0;index--){
            for(int d=2;d<=target;d++){
                int max=0;
                int min=Integer.MAX_VALUE;
                for(int i=index;i<jobDifficulty.length;i++){
                    max=Math.max(max,jobDifficulty[i]);
                    int next=dp[i+1][d-1];
                    if(next!=Integer.MAX_VALUE) min=Math.min(max+next,min);
                }
                dp[index][d]=min;
            }
        }
        return dp[0][target];
    }
}

🥦 运行结果

动态规划搞定
在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/535250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

又一个开源便斩获 7k star 的新模型「GitHub 热点速览」

作者&#xff1a;HelloGitHub-小鱼干 Star 并不能代表什么&#xff0c;但是绝对能表示一个项目的受欢迎程度。就像刚开源一周就有 7k star 的新模型&#xff0c;输入文本 / 图像就能获得 3D 对象。除了这个新模型&#xff0c;本周还有一款新的 Web 3D 渲染引擎 Orillusion&…

MySQL学习---17、MySQL8其它新特性

1、MySQL新增特性 1.1 更简便的NoSQL支持 NoSQL泛指非关系型数据库和数据存储。随着互联网平台的规模飞速发展&#xff0c;传统的关系型数据库已经越来越不能瞒住需求。从5.6版本开始&#xff0c;MySQL就开始支持简单的NoSQL存储功能。MySQL 8对这一功能做了优化&#xff0c;…

阿里P8强烈推荐的可伸缩服务架构:框架与中间件笔记

随着企业业务量的增加&#xff0c;流量洪峰在不断挑战着业务系统的承载能力&#xff0c;设计高并发、可伸缩的系统已成为软件架构师的紧迫任务&#xff0c;而分布式、可伸缩的架构模式已成为抵御洪峰的有效方案之一。本书汇集了作者在多年核心系统开发中的架构及实践经验&#…

【算法】--- 几分钟带你走进排序算法大门(上)

文章目录 前言&#x1f31f;一、常见的排序算法&#xff1a;&#x1f31f;二、直接插入排序排序&#xff1a;&#x1f4d2;2.1 基本思想&#xff1a;&#x1f4d2;2.2 代码&#xff1a;&#x1f4d2;2.3 时间复杂度&#xff1a;O(N^2)&#x1f4d2;2.4 流程图详解&#xff1a; …

聚观早报 | Midjourney官方在QQ开启内测;富士康印度新工厂动工

今日要闻&#xff1a;Midjourney官方在QQ开启内测&#xff1b;富士康印度新工厂动工&#xff1b;闲鱼将开收软件服务费&#xff1b;专家建议五年内禁售燃油车&#xff1b;笑果文化已被立案调查 Midjourney官方在QQ开启内测 5 月 15 日&#xff0c;据 Midjourney AI 微信公众号…

Unity之OpenXR+XR Interaction Toolkit实现 手枪模型的拆卸和组装

前言 之前我们曾实现过PC端的模型的拆卸和组装&#xff0c;如果使用VR模式来实现物体的拆卸呢&#xff1f;如何使用双手手柄来控制物体&#xff0c;拆卸物体呢&#xff1f;今天我们就来实现一个VR小Demo&#xff0c;基于OpenXR &#xff0c;XR Interaction Toolkit插件来实现。…

程序员面试宝典

前言 编者: 大淘宝技术开发工程师 / 刘苏宏(淘苏) 淘苏(花名)目前是大淘宝技术的一名开发工程师。从国企 跳槽来到互联网&#xff0c;【职业规划】是他被问得最多&#xff0c;也思考得 最多的问题。 扫一扫&#xff0c;关注公众号【大淘宝技术】 了解更多大淘宝技术干货沉淀 …

技术架构演进之路-Docker【一】

技术架构演进之路 了解每种技术架构以及如何演进的&#xff0c;熟悉Docker在架构中的核心作用 八大架构演进 单机架构 当前服务由应用服务和数据库服务两个服务组成&#xff0c;应用服务由 用户模块、商品模块、交易模块三个模块组成&#xff0c;我们可以理解它为 淘宝。用户模…

互联网时代,自媒体宣发的概念、优势、策略及注意事项

自媒体宣发是指通过自己或者委托专业机构&#xff0c;运用自媒体平台传播宣传信息的一种方式。在互联网时代&#xff0c;自媒体已经成为了企业推广的一种重要手段。本文将为大家介绍自媒体宣发的概念、优势、策略及注意事项。#自媒体# 一、什么是自媒体宣发&#xff1f; 自媒体…

通配符SSL证书是什么?

通配符SSL证书可以对申请的域名保护以外&#xff0c;还可以对下一级子域名无限使用&#xff0c;适合存在很多二级域名项目的网站&#xff0c;这样不需要额外对子域名申请SSL证书&#xff0c;还可以进行同意管理及部署SSL证书避免跨站窜站的问题。 申请通配符SSL证书 一、申请通…

SSH远程终端神器,你在用哪一款

唠嗑部分 在我们日常开发中啊&#xff0c;不可避免的要与Linux打交道&#xff0c;虽然我们作为开发&#xff0c;不要求我们对Linux有多么的专业&#xff0c;但是基本的操作还是要会的&#xff0c;举几个常用的例子&#xff1a; 1、查看nginx配置&#xff0c;配置转发 2、清理…

蓝桥杯模块学习4——数码管

第一章 硬件部分 1.1 电路的组成部分 1.1.1 译码器和锁存器 具体可回顾之前LED灯的文章&#xff1a; https://blog.csdn.net/weixin_63568691/article/details/130660096 1.1.2 共阳极数码管&#xff1a; 原理图&#xff1a; 功能&#xff1a; &#xff08;1&#xff09;可…

[网鼎杯 2020 青龙组]bang 复现--frida-dexdump安卓脱壳工具的使用

一.前言 在NSSCTF练习安卓逆向,第一次遇到安卓脱壳题 大佬的题解只有一句话"frida-dexdump一把嗦" 听起来容易做起来难,还遇到了安卓虚拟机的玄学bug,折磨了我很久,好在最终使用真机成功dump并得到flag 题目来源:[网鼎杯 2020 青龙组]bang 如果直接用jadx打开会发现…

重大喜讯!国产讯飞星火大模型将超越chatGPT!

引言 近年来&#xff0c;随着人工智能技术的快速发展&#xff0c;自然语言处理成为了研究的热点。而在自然语言处理领域&#xff0c;ChatGPT是一个备受关注的模型&#xff0c;它的出现极大地推动了自然语言处理技术的发展。然而&#xff0c;最近国内一家公司——讯飞&#xff0…

记录--10个超级实用的Set、Map使用技巧

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 Set是一种类似于数组的数据结构&#xff0c;但是它的值是唯一的&#xff0c;即Set中的每个值只会出现一次。Set对象的实例可以用于存储任何类型的唯一值&#xff0c;从而使它们非常适用于去重。 Map是…

如何为研发团队打造专属的效能提升路径|QECon 演讲回顾

近日&#xff0c;ONES 受邀参加 2023 QECon 全球软件质量&效能大会&#xff08;深圳站&#xff09;。在会上&#xff0c;ONES 研发效能改进咨询顾问陈仪&#xff0c;发表了主题为《如何为研发团队打造专属的效能提升路径》的演讲。 陈仪有着丰富的咨询经验&#xff0c;曾带…

C++考试

文章目录 1.程序填空1.1函数调用1.2前置和后置“”、“--”运算符重载1.3异常处理1.4文本文件读取 2.程序阅读2.1C编程基础2.2继承与派生2.3静态成员2.4继承与派生2.5 输入输出2.6 模板 3.程序改错3.1三种访问权限3.2 友元3.3抽象类不能实例化对象3.4常数据成员初始化必须使用构…

面试题总结

1、0513 1.重载和重写的区别? 重载发生在同一类中&#xff0c;同名的方法如果有不同的参数列表&#xff08;类型不同、个数不同、顺序不同&#xff09;则视为重载。 重写发生在父子类中&#xff0c;重写要求子类重写之后的方法与父类被重写方法有相同的返回类型&#xff0c;比…

Linux:在VMware中,如果虚拟机之前可以上网,之后突然不能上网,怎么办?

Linux系统版本&#xff1a;centos 7.5 x64位 VMware版本&#xff1a; VMware Workstation Pro 16 文章目录 前言一、什么原因会导致这种问题并如何解决它&#xff1f;原因①&#xff1a;虚拟机没有启动网络服务原因②&#xff1a;外部主机上VMware的【VMware NAT Service】服务…

Linux常用命令——htpasswd命令

在线Linux命令查询工具 htpasswd apache服务器创建密码认证文件 补充说明 htpasswd命令是Apache的Web服务器内置工具&#xff0c;用于创建和更新储存用户名、域和用户基本认证的密码文件。 语法 htpasswd(选项)(参数) 选项 -c&#xff1a;创建一个加密文件&#xff1b;…