2892. 将相邻元素相乘后得到最小化数组 🔒
题目描述
给定一个整数数组 nums
和一个整数 k
,你可以对数组执行以下操作任意次数:
- 选择数组中的两个 相邻 元素,例如
x
和y
,使得x * y <= k
,并用一个值为x * y
的 单个元素 替换它们(例如,在一次操作中,数组[1, 2, 2, 3]
,其中k = 5
可以变为[1, 4, 3]
或[2, 2, 3]
,但不能变为[1, 2, 6]
)。
返回 经过任意次数的操作后, nums
的 最小 可能长度。
示例 1:
输入:nums = [2,3,3,7,3,5], k = 20 输出:3 解释:我们执行以下操作: 1. [2,3,3,7,3,5] -> [6,3,7,3,5] 2. [6,3,7,3,5] -> [18,7,3,5] 3. [18,7,3,5] -> [18,7,15] 可以证明,在执行给定操作后,最小可能长度为3.
示例 2:
输入:nums = [3,3,3,3], k = 6 输出:4 解释:由于每两个相邻元素的乘积都大于 6,所以无法执行任何操作。因此,答案为 4。
约束条件:
1 <= nums.length <= 105
0 <= nums[i] <= 109
1 <= k <= 109
解法
方法一:贪心
我们用一个变量 $ans$ 记录当前数组的长度,用一个变量 $y$ 记录当前数组的乘积,初始时 $ans = 1$, $y = nums[0]$。
我们从数组的第二个元素开始遍历,设当前元素为 $x$:
- 如果 $x = 0$,那么整个数组的乘积为 $0 \le k$,因此答案数组的最小长度为 $1$,直接返回即可。
- 如果 $x \times y \le k$,那么我们可以将 $x$ 与 $y$ 合并,即 $y = x \times y$。
- 如果 $x \times y \gt k$,那么我们无法将 $x$ 与 $y$ 合并,因此我们需要将 $x$ 单独作为一个元素,即 $ans = ans + 1$,并且 $y = x$。
最终答案即为 $ans$。
时间复杂度 $O(n)$,其中 $n$ 为数组的长度。空间复杂度 $O(1)$。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|