comments | difficulty | edit_url | tags | |||
---|---|---|---|---|---|---|
true |
Medium |
|
Given an integer array nums
and an integer k
, you can perform the following operation on the array any number of times:
- Select two adjacent elements of the array like
x
andy
, such thatx * y <= k
, and replace both of them with a single element with valuex * y
(e.g. in one operation the array[1, 2, 2, 3]
withk = 5
can become[1, 4, 3]
or[2, 2, 3]
, but can't become[1, 2, 6]
).
Return the minimum possible length of nums
after any number of operations.
Example 1:
Input: nums = [2,3,3,7,3,5], k = 20 Output: 3 Explanation: We perform these operations: 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] It can be shown that 3 is the minimum length possible to achieve with the given operation.
Example 2:
Input: nums = [3,3,3,3], k = 6 Output: 4 Explanation: We can't perform any operations since the product of every two adjacent elements is greater than 6. Hence, the answer is 4.
Constraints:
1 <= nums.length <= 105
0 <= nums[i] <= 109
1 <= k <= 109
We use a variable
We start traversing from the second element of the array. Let the current element be
- If
$x = 0$ , then the product of the entire array is$0 \le k$ , so the minimum length of the answer array is$1$ , and we can return directly. - If
$x \times y \le k$ , then we can merge$x$ and$y$ , that is,$y = x \times y$ . - If
$x \times y \gt k$ , then we cannot merge$x$ and$y$ , so we need to treat$x$ as a separate element, that is,$ans = ans + 1$ , and$y = x$ .
The final answer is
The time complexity is
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;
}