【算法刷题】Day22

文章目录

  • 1. 按摩师
    • 题干:
    • 算法原理:(dp)
      • 1. 状态表示:
      • 2. 状态转移方程
      • 3. 初始化
      • 4. 填表顺序
      • 5. 返回值
    • 代码:
  • 2. 寻找数组的中心下标
    • 题干:
    • 算法原理:(前缀和)
    • 代码:
  • 3. 除自身以外数组的乘积
    • 题干:
    • 算法原理:(前缀和)
    • 代码:

1. 按摩师

在这里插入图片描述
原题链接


题干:

按摩师每次预约服务之间要休息
不能接受相邻的预约
给一个请求序列,摘到最优的预约集合,返回总分钟数

算法原理:(dp)

1. 状态表示:

dp[i] 表示:选择到 i 位置的时候,此时的最长预约时长
在这里插入图片描述
继续细化:
f[i] 表示:选择到 i 位置时, nums[i] 必选,此时的最⻓预约时长
g[i] 表示:选择到 i 位置时, nums[i] 不选,此时的最长预约时长

2. 状态转移方程

在这里插入图片描述

f[i] :
如果 nums[i] 必选,那么我们仅需知道 i - 1 位置在不选的情况下的最⻓预约时长
然后加上 nums[i] 即可
因此 f[i] = g[i - 1] + nums[i]

g[i] :
如果 nums[i] 不选,那么 i - 1 位置上选或者不选都可以
因此,我们需要知道 i- 1 位置上选或者不选两种情况下的最长时长
因此 g[i] = max(f[i - 1], g[i- 1])

在这里插入图片描述

3. 初始化

f[0] = nums[0]
g[0] = 0

4. 填表顺序

从左往右,两个表⼀起填

5. 返回值

max(f[n - 1], g[n - 1])


代码:

class Solution {public int massage(int[] nums) {int n = nums.length;if(n == 0) {return 0;}int[] f = new int[n];int[] g = new int[n];f[0] = nums[0];for(int i = 1; i < n; i++) {f[i] = g[i-1] + nums[i];g[i] = Math.max(g[i-1],f[i-1]);}return Math.max(f[n - 1],g[n - 1]);}
}

在这里插入图片描述


2. 寻找数组的中心下标

在这里插入图片描述
原题链接


题干:

中心下标:左侧元素和 = 右侧元素和
如果这个值在最左 或者 最右 和为0
有多个下标,返回最左边
不存在这个值,返回 -1
在这里插入图片描述


算法原理:(前缀和)

在这里插入图片描述
(1)预处理前缀和
f:前缀和数组
f[i] 表示:[0,i-1] 区间,所有元素的和
f[i] = f[i-1] + nums[i-1]

g:后缀和数组
g[i] 表示:[i+1,n-1] 区间,所有元素的和
g[i] = g[i+1] + nums[i+1]

(2)使用前缀和
在 0~n - 1 枚举下标 i
判断 f[i] = g[i]

(3)细节问题
f(0),g(0) 可能越界访问,需要初始化
f(0) = 0
g(n-1) = 0

(4)填表顺序
f:从左往右
g:从右往左


代码:

class Solution {public int pivotIndex(int[] nums) {int n = nums.length;int[] f = new int[n];int[] g = new int[n];for(int i = 1; i < n; i++) {f[i] = f[i - 1] + nums[i - 1];}for(int i = n - 2; i >= 0; i--) {g[i] = g[i + 1] + nums[i + 1];}for(int i = 0; i < n; i++) {if(f[i] == g[i]) {return i;}}return -1;}
}

在这里插入图片描述

3. 除自身以外数组的乘积

在这里插入图片描述
原题链接


题干:

nswer[i]等于nums中 nums[i] 之外其余各元素的乘积
前缀元素和后缀的乘积都在 32位 整数范围


算法原理:(前缀和)

在这里插入图片描述

(1)预处理前缀积
f:前缀积数组
f[i] 表示:[0,i-1] 区间,所有元素的乘积
f[i] = f[i-1] * nums[i-1]

g:后缀积数组
g[i] 表示:[i+1,n-1] 区间,所有元素的乘积
g[i] = g[i+1] * nums[i+1]

(2)使用前缀和
在这里插入图片描述
ret[i[i] = f[i] * g[i]

(3)细节问题
f(0) = 1
g(n-1) = 1

(4)填表顺序
f:从左往右
g:从右往左


代码:

class Solution {public int[] productExceptSelf(int[] nums) {int n = nums.length;int[] f = new int[n];int[] g = new int[n];f[0] = g[n-1] = 1;for(int i = 1; i < n; i++) {f[i] = f[i-1] * nums[i-1];}for(int i = n - 2 ; i >= 0; i--) {g[i] = g[i+1] * nums[i+1];}int[] ret = new int[n];for(int i = 0; i < n; i++) {ret[i] = f[i] * g[i];}return ret;}
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB ga函数的使用方法

一、ga句法结构 x ga(fitnessfcn,nvars) x ga(fitnessfcn,nvars,A,b) x ga(fitnessfcn,nvars,A,b,Aeq,beq) x ga(fitnessfcn,nvars,A,b,Aeq,beg,IB,UB) x ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon) x ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon,options) x …

Ubuntu 常用命令之 grep 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 grep命令是一个强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来。 grep命令的基本格式为 grep [options] pattern [file]。grep命令的主要参数有 -i&#xff1a;忽略大小写-v&…

Java整合APNS推送消息-IOS-APP(基于.p12推送证书)

推送整体流程 1.在开发者中心申请对应的证书&#xff08;我用的是.p12文件&#xff09; 2.苹果手机用户注册到APNS&#xff0c;APNS将注册的token返回给APP&#xff08;服务端接收使用&#xff09;。 3.后台服务连接APNS&#xff0c;获取连接对象 4.后台服务构建消息载体 5.后台…

SpringBoot的热部署

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

视频美颜SDK开发指南:实现高质量实时美颜效果

下文小编将于大家一同探讨美颜SDK的开发指南&#xff0c;希望开发者们能够获得一定的启发。 一、理解实时美颜的挑战 实时美颜涉及到对视频流进行实时处理&#xff0c;这对计算资源和算法效率提出了严峻的挑战。在开发视频美颜SDK之前&#xff0c;我们需要理解以下几个关键方…

【Linux系统编程二十二】:(信号1)--信号的产生与发送

【Linux系统编程二十二】&#xff1a;信号的产生与发送 一.理解特性二.信号的产生1.键盘组合键①.前台进程②.硬件中断 2.异常的本质①软件异常 3.异步的 三.信号的发送 一.理解特性 第一&#xff0c;我们能够识别这个信号。我们能知道这个信号是什么。 第二&#xff0c;我们能…

Security Boot secure Boot的介绍

什么是secure boot secure boot 是一种保证平台上软件完整性的过程或机制。secure boot会在硬件和软件之间建立一种信任关系。在启用secure boot之后&#xff0c;没有经过签名的固件和软件是无法运行在该设备上。通过这种方式可以保证操作系统免受恶意攻击。secure boot一般使…

AI中的强化学习是怎么做的呢?

1. 什么是强化学习 其他许多机器学习算法中学习器都是学得怎样做&#xff0c;而强化学习&#xff08;Reinforcement Learning, RL&#xff09;是在尝试的过程中学习到在特定的情境下选择哪种行动可以得到最大的回报。在很多场景中&#xff0c;当前的行动不仅会影响当前的rewar…

1270. 数列区间最大值(线段树求区间最大)

题目&#xff1a; 1270. 数列区间最大值 - AcWing题库 输入样例&#xff1a; 10 2 3 2 4 5 6 8 1 2 9 7 1 4 3 8输出样例&#xff1a; 5 8 代码&#xff1a; #include <cstdio> #include <iostream> #include <climits>//INT_MIN头文件using namespace s…

QC/PD快充电源产品应用介绍

• 原边650-700V SJ MOSFET采用低FOM值的ESM 技术&#xff0c;有利于提高系统效 率&#xff0c; 以及更佳的EAS和EMI等特性&#xff0c;对于一些不含PFC电路的系统更友好。 • 副边采用低FOM值的SGT同步整流电路&#xff0c;相比肖特基二极管整流能有更低的 损耗&#xff0c;有…

PSP - 结构生物学中的机器学习 (NIPS MLSB Workshop 2023.12)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135120094 Machine Learning in Structural Biology (机器学习在结构生物学中) 网址&#xff1a;https://www.mlsb.io/ Workshop at the 37th Co…