comments | difficulty | edit_url | tags | |||
---|---|---|---|---|---|---|
true |
中等 |
|
给定一个整数数组 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
我们用一个变量
我们从数组的第二个元素开始遍历,设当前元素为
- 如果
$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$ 。
最终答案即为
时间复杂度
class Solution:
def minArrayLength(self, nums: List[int], k: int) -> int:
ans, y = 1, nums[0]
for x in nums[1:]:
if x == 0:
return 1
if x * y <= k:
y *= x
else:
y = x
ans += 1
return ans
class Solution {
public int minArrayLength(int[] nums, int k) {
int ans = 1;
long y = nums[0];
for (int i = 1; i < nums.length; ++i) {
int x = nums[i];
if (x == 0) {
return 1;
}
if (x * y <= k) {
y *= x;
} else {
y = x;
++ans;
}
}
return ans;
}
}
class Solution {
public:
int minArrayLength(vector<int>& nums, int k) {
int ans = 1;
long long y = nums[0];
for (int i = 1; i < nums.size(); ++i) {
int x = nums[i];
if (x == 0) {
return 1;
}
if (x * y <= k) {
y *= x;
} else {
y = x;
++ans;
}
}
return ans;
}
};
func minArrayLength(nums []int, k int) int {
ans, y := 1, nums[0]
for _, x := range nums[1:] {
if x == 0 {
return 1
}
if x*y <= k {
y *= x
} else {
y = x
ans++
}
}
return ans
}
function minArrayLength(nums: number[], k: number): number {
let [ans, y] = [1, nums[0]];
for (const x of nums.slice(1)) {
if (x === 0) {
return 1;
}
if (x * y <= k) {
y *= x;
} else {
y = x;
++ans;
}
}
return ans;
}