Given an array of integers target
. From a starting array, A
consisting of all 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 < target.size
and set the value ofA
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 A
otherwise return False.
Example 1:
Input: target = [9,3,5] Output: true Explanation: Start with [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
public boolean isPossible(int[] A) { PriorityQueue<Integer> pq = new PriorityQueue<Integer>((a, b) -> (b - a)); long total = 0; for (int a : A) { total += a; pq.add(a); } while (true) { int a = pq.poll(); total -= a; if (a == 1 || total == 1) return true; if (a < total || total == 0 || a % total == 0) return false; a %= total; total += a; pq.add(a); } }
大佬牛逼啊
整体逻辑是因为每次最大的数都是由sum得来的,所以逆推最大数 - 除此之外的sum,看最后数组是不是只剩下1来判断。
百分号的作用是避免重复计算
total==0是为[2]准备的
a % total == 0 为[4, 2]准备的