comments | difficulty | edit_url | rating | source | tags | ||
---|---|---|---|---|---|---|---|
true |
Hard |
2014 |
Weekly Contest 176 Q4 |
|
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
x
be the sum of all elements currently in your array. - choose index
i
, such that0 <= i < n
and set the value ofarr
at indexi
tox
. - 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
We find that if we start from the array
Therefore, we can use a priority queue (max heap) to store the elements in the array false
. Otherwise, we calculate true
.
The time complexity is
class Solution:
def isPossible(self, target: List[int]) -> bool:
s = sum(target)
pq = [-x for x in target]
heapify(pq)
while -pq[0] > 1:
mx = -heappop(pq)
t = s - mx
if t == 0 or mx - t < 1:
return False
x = (mx % t) or t
heappush(pq, -x)
s = s - mx + x
return True
class Solution {
public boolean isPossible(int[] target) {
PriorityQueue<Long> pq = new PriorityQueue<>(Collections.reverseOrder());
long s = 0;
for (int x : target) {
s += x;
pq.offer((long) x);
}
while (pq.peek() > 1) {
long mx = pq.poll();
long t = s - mx;
if (t == 0 || mx - t < 1) {
return false;
}
long x = mx % t;
if (x == 0) {
x = t;
}
pq.offer(x);
s = s - mx + x;
}
return true;
}
}
class Solution {
public:
bool isPossible(vector<int>& target) {
priority_queue<int> pq;
long long s = 0;
for (int i = 0; i < target.size(); i++) {
s += target[i];
pq.push(target[i]);
}
while (pq.top() != 1) {
int mx = pq.top();
pq.pop();
long long t = s - mx;
if (t < 1 || mx - t < 1) {
return false;
}
int x = mx % t;
if (x == 0) {
x = t;
}
pq.push(x);
s = s - mx + x;
}
return true;
}
};
func isPossible(target []int) bool {
pq := &hp{target}
s := 0
for _, x := range target {
s += x
}
heap.Init(pq)
for target[0] > 1 {
mx := target[0]
t := s - mx
if t < 1 || mx-t < 1 {
return false
}
x := mx % t
if x == 0 {
x = t
}
target[0] = x
heap.Fix(pq, 0)
s = s - mx + x
}
return true
}
type hp struct{ sort.IntSlice }
func (h hp) Less(i, j int) bool { return h.IntSlice[i] > h.IntSlice[j] }
func (hp) Pop() (_ any) { return }
func (hp) Push(any) {}
function isPossible(target: number[]): boolean {
const pq = new MaxPriorityQueue();
let s = 0;
for (const x of target) {
s += x;
pq.enqueue(x);
}
while (pq.front().element > 1) {
const mx = pq.dequeue().element;
const t = s - mx;
if (t < 1 || mx - t < 1) {
return false;
}
const x = mx % t || t;
pq.enqueue(x);
s = s - mx + x;
}
return true;
}