1354. Construct Target Array With Multiple Sums
Description
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.length1 <= n <= 5 * 1041 <= target[i] <= 109
Solutions
Solution 1: Reverse Construction + Priority Queue (Max Heap)
We find that if we start from the array \(arr\) and construct the target array \(target\) forward, it is not easy to determine which index \(i\) to choose each time, and the problem is relatively complex. However, if we start from the array \(target\) and construct it in reverse, each construction must choose the largest element in the current array, which can ensure that each construction is unique, and the problem is relatively simple.
Therefore, we can use a priority queue (max heap) to store the elements in the array \(target\), and use a variable \(s\) to record the sum of all elements in the array \(target\). Each time we take out the largest element \(mx\) from the priority queue, calculate the sum \(t\) of all elements in the current array except \(mx\). If \(t < 1\) or \(mx - t < 1\), it means that the target array \(target\) cannot be constructed, and we return false. Otherwise, we calculate \(mx \bmod t\). If \(mx \bmod t = 0\), let \(x = t\), otherwise let \(x = mx \bmod t\), add \(x\) to the priority queue, and update the value of \(s\), repeat the above operations until all elements in the priority queue become \(1\), then return true.
The time complexity is \(O(n \log n)\), and the space complexity is \(O(n)\). Where \(n\) is the length of the array \(target\).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |