LC-2518.好分区的数目
题目描述
给你一个正整数数组 nums 和一个整数 k 。
分区 的定义是:将数组划分成两个有序的 组 ,并满足每个元素 恰好 存在于 某一个 组中。如果分区中每个组的元素和都大于等于 k ,则认为分区是一个好分区。
返回 不同 的好分区的数目。由于答案可能很大,请返回对 10^9 + 7 取余 后的结果。
如果在两个分区中,存在某个元素 nums[i] 被分在不同的组中,则认为这两个分区不同。
示例1:
1 |
|
提示1:
1 |
|
反向思维
该题的关键在于,由于 $nums[i]$ 能取到 $10^9$ ,也就是说子序列的元素和最大能取到 $10^{12}$ ,我们很难定义该容量的背包,所以需要对原问题进行转化,尝试将原问题转化成求所有坏分区的数目,此时用总分区数目减去坏分区数目即为原问题答案。
当数组总和小于 $2*k$ 时,显然无论怎么划分都无法得出好分区,所以可以提前返回 $0$ 。
我们可以先尝试求出元素总和小于 $k$ 的子序列数目,由于 $k$ 最大取到 $1000$ ,所以通过背包 $dp$ 就能很容易的求出该数目。
设元素总和小于 $k$ 的子序列数目为 $badCnt$ ,由于对于数组总和小于 $2*k$ 的用例我们都直接返回,所以此时这些坏序列所对应的另一半序列的和,都必然是大于 $k$ 的,也就是说不存在互相配对的情况,而又因为该子序列可以是分区的左边或者右边,所以此时坏分区的数目就为 $2 * badCnt$ 。
1 |
|
LC-2518.好分区的数目
https://wecgwm.github.io/2023/03/02/LC-2518-好分区的数目/