【LeetCode】检查数组是否存在有效划分 Java 题解
题目描述
给你一个下标从 0 开始的整数数组 nums ,你必须将数组划分为一个或多个 连续 子数组。
如果获得的这些子数组中每个都能满足下述条件 之一 ,则可以称其为数组的一种 有效 划分:
子数组 恰 由 2 个相等元素组成,例如,子数组 [2,2] 。子数组 恰 由 3 个相等元素组成,例如,子数组 [4,4,4] 。子数组 恰 由 3 个连续递增元素组成,并且相邻元素之间的差值为 1 。例如,子数组 [3,4,5] ,但是子数组 [1,3,5] 不符合要求。如果数组 至少 存在一种有效划分,返回 true ,否则,返回 false 。
思路分析
今天的算法题目是数组形式的题目,题目要求将数组重新有效划分。题目定义子数组 恰 由 2 个相等元素组成,或者子数组 恰 由 3 个相等元素组成,或者子数组 恰 由 3 个连续递增元素组成,并且相邻元素之间的差值为 1。
理解清楚题意之后,如何去做呢? “如果数组 至少 存在一种有效划分,返回 true ,否则,返回 false 。” 从这一句可以得出,我们要使用三个条件,并且是或的关系,一真则真。
上面的三个有效划分,也可以理解为三个子问题。在这里,我们采用动态规划的方式解决问题。动态规划(Dynamic Programming, DP)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
我们定义 dp[i+1] 表示从 nums[0] 到 nums[i] 的这些元素能否有效划分。首先设置 dp[0] = true, 方便后面的逻辑判断。接着,依次写出上述三个条件的代码。根据逻辑判断,动态更新 dp[i + 1] 的情况。 具体实现代码如下,请参考。
通过代码
总结
上述算法的是时间复杂度是 O(n),空间复杂度是 O(n)
在用 DP 思想解决问题的时候,需要注意子问题的拆分,这个题目已经帮助我们拆分好了子问题,理清逻辑关系,写出递推公式并验证。多写多练,更好的掌握 DP 解题方法。
坚持算法每日一题,加油!
版权声明: 本文为 InfoQ 作者【Albert】的原创文章。
原文链接:【http://xie.infoq.cn/article/5f9e13c49242a76e2a0c56512】。文章转载请联系作者。
评论