Suppose we have an array of integers target. From a starting array A consisting of all 1's, we can perform the following procedure −
Consider x be the sum of all elements currently in our array.
Choose index i, in range 0 to n, where n is the size of the array and set the value of A at index i to x.
We can repeat this procedure as many times as we need.
We have to check whether it is possible to make the target array from A otherwise return False.
So, if the input is like [3,9,5], then the output will be True, as we can start with index [1,1,1], then sum is 3 at index 0, then the array is [3,1,1], then the sum is 5, at index 2, then the array is [3,1,5], then the sum is 9, at index 1, so array is [3,9,5].
To solve this, we will follow these steps −
sum := 0
n := size of target
for initialize i := 0, when i < n, update (increase i by 1), do −
sum := sum + target[i]
Define priority queue pq, and initialize it with target array
while top element of pq > sum, do −
x := top element of pq
delete element from pq
insert 2 * x - sum into pq
sum := x
return true when sum is same as size of target, otherwise false
Let us see the following implementation to get better understanding −
Example
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
bool isPossible(vector<int>& target) {
lli sum = 0;
int n = target.size();
for (int i = 0; i < n; i++) {
sum += target[i];
}
priority_queue<int> pq(target.begin(), target.end());
while (pq.top() * 2 > sum) {
int x = pq.top();
pq.pop();
pq.push(2 * x - sum);
sum = x;
}
return sum == (int)target.size();
}
};
main(){
Solution ob;
vector<int> v = {3,9,5};
cout << (ob.isPossible(v));
}Input
{3,9,5}Output
1