1354 - Construct Target Array With Multiple Sums
Description (leetcode)
You are given an array target of n integers. From a starting array arr consisting of n 1′s, you may perform the following procedure :
- let
xbe the sum of all elements currently in your array. - choose index
i, such that0 <= i < nand set the value ofarrat indexitox. - You may repeat this procedure as many times as needed.
Return true if it is possible to construct the target array from arr, otherwise, return false.
Example 1:
Input: target = [9,3,5]
Output: true
Explanation: Start with arr = [1, 1, 1]
[1, 1, 1], sum = 3 choose index 1
[1, 3, 1], sum = 5 choose index 2
[1, 3, 5], sum = 9 choose index 0
[9, 3, 5] Done
Example 2:
Input: target = [1,1,1,2]
Output: false
Explanation: Impossible to create target array from [1,1,1,1].
Example 3:
Input: target = [8,5]
Output: true
Constraints:
n == target.length- 1 <= n <= 5 * 104
- 1 <= target[i] <= 109
submission
click to reveal
impl Solution {
pub fn is_possible(target: Vec<i32>) -> bool {
let mut heap = target
.into_iter()
.map(|m| m as i64)
.collect::<std::collections::BinaryHeap<_>>();
let mut sum: i64 = heap.iter().copied().sum();
while let Some(mut m) = heap.pop() {
if m == 1 {
return true;
}
let rest = sum - m;
if rest == 0 || m <= rest {
return false;
}
m = match m % rest == 0 {
true => rest,
false => m % rest,
};
sum = rest + m;
heap.push(m);
}
false
}
}