2024.3.28力扣每日一题——访问完所有房间的第一天

2024-04-08 18:44

本文主要是介绍2024.3.28力扣每日一题——访问完所有房间的第一天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2024.3.28

      • 题目来源
      • 我的题解
        • 方法一 模拟
        • 方法二 动态规划

题目来源

力扣每日一题;题序:1997

我的题解

方法一 模拟

使用一个Set存储已经访问过的房间号,直到Set中的元素个数等于房间数时停止模拟。

时间复杂度:O(day)。能够访问完所有房间的最小天数
空间复杂度:O(n)。count数组记录房间被访问次数的奇偶

public int firstDayBeenInAllRooms(int[] nextVisit) {int n=nextVisit.length;int[] count=new int[n];Set<Integer> set=new HashSet<>();int i=0;long day=0;int mod=1000000007;set.add(0);while(set.size()<n){if(count[i]==0){count[i]=1;i=nextVisit[i];}else{count[i]=0;i=(i+1)%n;}day=(day+1)%mod;set.add(i);}return (int)(day%mod);
}
方法二 动态规划

当访问次数是奇数时下次访问会回访,只有访问次数是偶数才会遍历下一个房间。所以,在访问房间i时,左边的房间一定都已经访问了偶数次(不然不可能到达i)。也就是从 i回到 j 时,此时 [j,i−1] 范围内的房间都处于访问偶数次的状态。那么当我们访问这个范围内的每个房间时,算上本次访问,访问次数一定是奇数,所以要想重新回到 iii,对于 [j,i−1] 范围内的每个房间,都需要执行一次「回访」。
定义 f[i] 表示从「访问到房间 i 且次数为奇数」到「访问到房间 i且次数为偶数」所需要的天数。定义包含了首次访问房间 i的一天,和重新回到房间 i 的一天
由于 [j,i−1]范围内的每个房间都需要「回访」,所以需要把这个范围内的 fff 值都加起来,再算上房间 i 需要访问 2次。所以,状态转移方程:
f [ i ] = 2 + ∑ k = j i − 1 f [ k ] f[i]=2+\sum_{k=j}^{i-1}f[k] f[i]=2+k=ji1f[k]
和式采用前缀和优化,最终的状态转移方程:
d p [ i + 1 ] = d p [ i ] ∗ 2 − d p [ j ] + 2 dp[i+1]=dp[i]*2-dp[j]+2 dp[i+1]=dp[i]2dp[j]+2
dp[i]表示 ∑ j = 0 i f [ i ] \sum_{j=0}^{i}f[i] j=0if[i]

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

public int firstDayBeenInAllRooms(int[] nextVisit) {int n = nextVisit.length;int mod=1_000_000_007;long[] dp = new long[n];for (int i = 0; i < n-1; i++) {int j=nextVisit[i];dp[i+1]=(dp[i]*2-dp[j]+2+mod)%mod;//需要避免算出负数}return (int)dp[n-1];
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

这篇关于2024.3.28力扣每日一题——访问完所有房间的第一天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/886260

相关文章

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

NGINX 配置内网访问的实现步骤

《NGINX配置内网访问的实现步骤》本文主要介绍了NGINX配置内网访问的实现步骤,Nginx的geo模块限制域名访问权限,仅允许内网/办公室IP访问,具有一定的参考价值,感兴趣的可以了解一下... 目录需求1. geo 模块配置2. 访问控制判断3. 错误页面配置4. 一个完整的配置参考文档需求我们有一

C#实现访问远程硬盘的图文教程

《C#实现访问远程硬盘的图文教程》在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件,这次我们将给出一个完整的... 目录引言一. 远程硬盘功能展示二. 远程硬盘代码实现1. 底层业务通信实现2. UI 实现三. De

python通过curl实现访问deepseek的API

《python通过curl实现访问deepseek的API》这篇文章主要为大家详细介绍了python如何通过curl实现访问deepseek的API,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编... API申请和充值下面是deepeek的API网站https://platform.deepsee

Nginx 访问 /root/下 403 Forbidden问题解决

《Nginx访问/root/下403Forbidden问题解决》在使用Nginx作为Web服务器时,可能会遇到403Forbidden错误,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录解决 Nginx 访问 /root/test/1.html 403 Forbidden 问题问题复现Ng

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL