Welcome to Subscribe On Youtube
2892. Minimizing Array After Replacing Pairs With Their Product
Description
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
Solutions
Solution 1: Greedy
We use a variable $ans$ to record the current length of the array, and a variable $y$ to record the current product of the array. Initially, $ans = 1$ and $y = nums[0]$.
We start traversing from the second element of the array. Let the current element be $x$:
- 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 $ans$.
The time complexity is $O(n)$, where n is the length of the array. The space complexity is $O(1)$.
-
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; } };
-
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
-
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; }