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中动态生成SQL语句去掉所有字段的空格的操作方法

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

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

本地搭建DeepSeek-R1、WebUI的完整过程及访问

《本地搭建DeepSeek-R1、WebUI的完整过程及访问》:本文主要介绍本地搭建DeepSeek-R1、WebUI的完整过程及访问的相关资料,DeepSeek-R1是一个开源的人工智能平台,主... 目录背景       搭建准备基础概念搭建过程访问对话测试总结背景       最近几年,人工智能技术

Ollama整合open-webui的步骤及访问

《Ollama整合open-webui的步骤及访问》:本文主要介绍如何通过源码方式安装OpenWebUI,并详细说明了安装步骤、环境要求以及第一次使用时的账号注册和模型选择过程,需要的朋友可以参考... 目录安装环境要求步骤访问选择PjrIUE模型开始对话总结 安装官方安装地址:https://docs.

解读静态资源访问static-locations和static-path-pattern

《解读静态资源访问static-locations和static-path-pattern》本文主要介绍了SpringBoot中静态资源的配置和访问方式,包括静态资源的默认前缀、默认地址、目录结构、访... 目录静态资源访问static-locations和static-path-pattern静态资源配置