返回介绍

solution / 1300-1399 / 1354.Construct Target Array With Multiple Sums / README_EN

发布于 2024-06-17 01:03:20 字数 6093 浏览 0 评论 0 收藏 0

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 x be the sum of all elements currently in your array.
  • choose index i, such that 0 <= i < n and set the value of arr at index i to x.
  • 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

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$.

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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文