【动态规划-划分型 DP】力扣2369. 检查数组是否存在有效划分

server/2024/11/14 16:46:13/

给你一个下标从 0 开始的整数数组 nums ,你必须将数组划分为一个或多个 连续 子数组。

如果获得的这些子数组中每个都能满足下述条件 之一 ,则可以称其为数组的一种 有效 划分:

子数组 恰 由 2 个相等元素组成,例如,子数组 [2,2] 。
子数组 恰 由 3 个相等元素组成,例如,子数组 [4,4,4] 。
子数组 恰 由 3 个连续递增元素组成,并且相邻元素之间的差值为 1 。例如,子数组 [3,4,5] ,但是子数组 [1,3,5] 不符合要求。
如果数组 至少 存在一种有效划分,返回 true ,否则,返回 false 。

示例 1:
输入:nums = [4,4,4,5,6]
输出:true
解释:数组可以划分成子数组 [4,4] 和 [4,5,6] 。
这是一种有效划分,所以返回 true 。

示例 2:
输入:nums = [1,1,1,2]
输出:false
解释:该数组不存在有效划分。

在这里插入图片描述

动态规划

class Solution {
public:bool validPartition(vector<int>& nums) {int n = nums.size();vector<int> dp(n+1, 0);if(n == 2){return nums[1] == nums[0];}dp[0] = 1;dp[2] = nums[1] == nums[0];for(int i = 3; i < n+1; i++){if(nums[i-1] == nums[i-2]){dp[i] |= dp[i-2];}if(nums[i-1] == nums[i-2] && nums[i-2] == nums[i-3]){dp[i] |= dp[i-3];}if(nums[i-1] == nums[i-2]+1 && nums[i-2] == nums[i-3]+1){dp[i] |= dp[i-3];}}return dp[n];}
};

时间复杂度:O(n),其中 n 是数组 nums 的长度。我们仅遍历一次 nums。
时间复杂度:O(n)。数组 dp 消耗 O(n)。

我们定义一个dp,用来储存在前i个元素中,是否有至少一个有效划分。我们在遍历过程中,一旦发现此时最近的几个元素,能够满足三种有效划分情况的一种,我们根据在这几个元素之前是否也存在有效划分,如果存在,那么说明目前至少存在一种有效划分。

最后返回dp[n]即可。

空间优化

class Solution {
public:bool validPartition(vector<int>& nums) {int n = nums.size();if (n == 2) {return nums[1] == nums[0];}// 只需要三个变量来存储之前的状态bool dp0 = true;              // 对应于 dp[i-3]bool dp1 = false;             // 对应于 dp[i-2]bool dp2 = nums[1] == nums[0]; // 对应于 dp[i-1]bool current = false;          // 用于存储 dp[i] 的值for (int i = 3; i <= n; i++) {current = false;if (nums[i - 1] == nums[i - 2]) {current |= dp1;}if (nums[i - 1] == nums[i - 2] && nums[i - 2] == nums[i - 3]) {current |= dp0;}if (nums[i - 1] == nums[i - 2] + 1 && nums[i - 2] == nums[i - 3] + 1) {current |= dp0;}// 更新 dp0, dp1, dp2dp0 = dp1;dp1 = dp2;dp2 = current;}return current;}
};

空间压缩至O(1)

通过对未压缩代码观察,我们发现我们在动态规划状态转移过程中,最多只用到当前元素和前面两个元素,那么说明我们可以用三个变量来储存这些状态,然后在遍历nums的过程中不断覆盖滚动。


http://www.ppmy.cn/server/141324.html

相关文章

如何利用静态住宅IP提升TikTok营销效果:应对平台限制与账号安全的新利器

随着TikTok的全球化和日益严苛的运营政策&#xff0c;越来越多的品牌和商家开始面临着平台地域限制、账户管理及内容推广的挑战。特别是在多个账户管理和跨境营销中&#xff0c;如何避免账号封禁、提高内容曝光&#xff0c;成为了亟待解决的问题。在这种背景下&#xff0c;代理…

Pure Adminrelease(水滴框架配置)

Pure Admin 保姆级文档&#xff08;已兼容最新版v5.8.0&#xff09; 1.如果您还没安装 pnpm&#xff0c;请执行下面命令进行安装 npm install -g pnpm 2.安装依赖 pnpm install 3.启动 pnpm dev 登录背景图片的修改 修改登录验证规则(只留了为空提示&#xff0c;我是把这文…

游戏引擎学习第四天

视频参考:https://www.bilibili.com/video/BV1aDmqYnEnc/ BitBlt 是 Windows GDI&#xff08;图形设备接口&#xff09;中的一个函数&#xff0c;用于在设备上下文&#xff08;device context, DC&#xff09;之间复制位图数据。BitBlt 的主要用途是将一个图像区域从一个地方复…

好算法的特性

【课堂笔记】 ### 课堂笔记&#xff1a;好算法的特性 1. **正确性**&#xff1a; - 符合语法要求&#xff0c;能够编译和链接。 - 能够正确处理各种类型的输入&#xff0c;包括&#xff1a; - 简单的输入。 - 大规模的输入。 - 一般性的输入。 - 退…

vue中如何关闭eslint检测?

ESLint作为一个用于JavaScript代码的验证工具&#xff0c;主要用于检查代码语法和编码规范。本文旨在指导那些希望在Vue.js项目中禁用ESLint验证功能的用户。对于需要这一操作的朋友&#xff0c;以下内容将提供参考。 vue中如何关闭eslint检测&#xff1f; 有了eslint的校验&…

深入浅出JUC常用同步器

文章目录 1.JUC下同步器1.1 CountdownLatch 倒计数锁存器1.2 CyclicBarrier回环屏障1.3 Semephone 信号量 2.小结 1.JUC下同步器 日常开发会遇到主线程开启多个子线程去并行执行任务&#xff0c;并且主线程需要等待所有子线程执行完后在进行汇总的场景。 同步器出现之前&…

【算法】【优选算法】二分查找算法(下)

目录 一、852.⼭脉数组的峰顶索引1.1 二分查找1.2 暴力枚举 二、162.寻找峰值2.1 二分查找2.2 暴力枚举 三、153.寻找旋转排序数组中的最⼩值3.1 二分查找3.2 暴力枚举 四、LCR 173.点名4.1 二分查找4.2 哈希表4.3 暴力枚举4.4 位运算4.5 数学&#xff08;求和&#xff09; 一、…

计算机毕业设计Python+图神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…