返回介绍

solution / 1700-1799 / 1769.Minimum Number of Operations to Move All Balls to Each Box / README_EN

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

1769. Minimum Number of Operations to Move All Balls to Each Box

中文文档

Description

You have n boxes. You are given a binary string boxes of length n, where boxes[i] is '0' if the ith box is empty, and '1' if it contains one ball.

In one operation, you can move one ball from a box to an adjacent box. Box i is adjacent to box j if abs(i - j) == 1. Note that after doing so, there may be more than one ball in some boxes.

Return an array answer of size n, where answer[i] is the minimum number of operations needed to move all the balls to the ith box.

Each answer[i] is calculated considering the initial state of the boxes.

 

Example 1:

Input: boxes = "110"
Output: [1,1,3]
Explanation: The answer for each box is as follows:
1) First box: you will have to move one ball from the second box to the first box in one operation.
2) Second box: you will have to move one ball from the first box to the second box in one operation.
3) Third box: you will have to move one ball from the first box to the third box in two operations, and move one ball from the second box to the third box in one operation.

Example 2:

Input: boxes = "001011"
Output: [11,8,5,4,3,4]

 

Constraints:

  • n == boxes.length
  • 1 <= n <= 2000
  • boxes[i] is either '0' or '1'.

Solutions

Solution 1

class Solution:
  def minOperations(self, boxes: str) -> List[int]:
    n = len(boxes)
    left = [0] * n
    right = [0] * n
    cnt = 0
    for i in range(1, n):
      if boxes[i - 1] == '1':
        cnt += 1
      left[i] = left[i - 1] + cnt
    cnt = 0
    for i in range(n - 2, -1, -1):
      if boxes[i + 1] == '1':
        cnt += 1
      right[i] = right[i + 1] + cnt
    return [a + b for a, b in zip(left, right)]
class Solution {
  public int[] minOperations(String boxes) {
    int n = boxes.length();
    int[] left = new int[n];
    int[] right = new int[n];
    for (int i = 1, cnt = 0; i < n; ++i) {
      if (boxes.charAt(i - 1) == '1') {
        ++cnt;
      }
      left[i] = left[i - 1] + cnt;
    }
    for (int i = n - 2, cnt = 0; i >= 0; --i) {
      if (boxes.charAt(i + 1) == '1') {
        ++cnt;
      }
      right[i] = right[i + 1] + cnt;
    }
    int[] ans = new int[n];
    for (int i = 0; i < n; ++i) {
      ans[i] = left[i] + right[i];
    }
    return ans;
  }
}
class Solution {
public:
  vector<int> minOperations(string boxes) {
    int n = boxes.size();
    int left[n];
    int right[n];
    memset(left, 0, sizeof left);
    memset(right, 0, sizeof right);
    for (int i = 1, cnt = 0; i < n; ++i) {
      cnt += boxes[i - 1] == '1';
      left[i] = left[i - 1] + cnt;
    }
    for (int i = n - 2, cnt = 0; ~i; --i) {
      cnt += boxes[i + 1] == '1';
      right[i] = right[i + 1] + cnt;
    }
    vector<int> ans(n);
    for (int i = 0; i < n; ++i) ans[i] = left[i] + right[i];
    return ans;
  }
};
func minOperations(boxes string) []int {
  n := len(boxes)
  left := make([]int, n)
  right := make([]int, n)
  for i, cnt := 1, 0; i < n; i++ {
    if boxes[i-1] == '1' {
      cnt++
    }
    left[i] = left[i-1] + cnt
  }
  for i, cnt := n-2, 0; i >= 0; i-- {
    if boxes[i+1] == '1' {
      cnt++
    }
    right[i] = right[i+1] + cnt
  }
  ans := make([]int, n)
  for i := range ans {
    ans[i] = left[i] + right[i]
  }
  return ans
}
function minOperations(boxes: string): number[] {
  const n = boxes.length;
  const left = new Array(n).fill(0);
  const right = new Array(n).fill(0);
  for (let i = 1, count = 0; i < n; i++) {
    if (boxes[i - 1] == '1') {
      count++;
    }
    left[i] = left[i - 1] + count;
  }
  for (let i = n - 2, count = 0; i >= 0; i--) {
    if (boxes[i + 1] == '1') {
      count++;
    }
    right[i] = right[i + 1] + count;
  }
  return left.map((v, i) => v + right[i]);
}
impl Solution {
  pub fn min_operations(boxes: String) -> Vec<i32> {
    let s = boxes.as_bytes();
    let n = s.len();
    let mut left = vec![0; n];
    let mut right = vec![0; n];
    let mut count = 0;
    for i in 1..n {
      if s[i - 1] == b'1' {
        count += 1;
      }
      left[i] = left[i - 1] + count;
    }
    count = 0;
    for i in (0..n - 1).rev() {
      if s[i + 1] == b'1' {
        count += 1;
      }
      right[i] = right[i + 1] + count;
    }
    (0..n)
      .into_iter()
      .map(|i| left[i] + right[i])
      .collect()
  }
}
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* minOperations(char* boxes, int* returnSize) {
  int n = strlen(boxes);
  int* left = malloc(sizeof(int) * n);
  int* right = malloc(sizeof(int) * n);
  memset(left, 0, sizeof(int) * n);
  memset(right, 0, sizeof(int) * n);
  for (int i = 1, count = 0; i < n; i++) {
    if (boxes[i - 1] == '1') {
      count++;
    }
    left[i] = left[i - 1] + count;
  }
  for (int i = n - 2, count = 0; i >= 0; i--) {
    if (boxes[i + 1] == '1') {
      count++;
    }
    right[i] = right[i + 1] + count;
  }
  int* ans = malloc(sizeof(int) * n);
  for (int i = 0; i < n; i++) {
    ans[i] = left[i] + right[i];
  }
  free(left);
  free(right);
  *returnSize = n;
  return ans;
}

Solution 2

class Solution:
  def minOperations(self, boxes: str) -> List[int]:
    n = len(boxes)
    ans = [0] * n
    cnt = 0
    for i in range(1, n):
      if boxes[i - 1] == '1':
        cnt += 1
      ans[i] = ans[i - 1] + cnt
    cnt = s = 0
    for i in range(n - 2, -1, -1):
      if boxes[i + 1] == '1':
        cnt += 1
      s += cnt
      ans[i] += s
    return ans
class Solution {
  public int[] minOperations(String boxes) {
    int n = boxes.length();
    int[] ans = new int[n];
    for (int i = 1, cnt = 0; i < n; ++i) {
      if (boxes.charAt(i - 1) == '1') {
        ++cnt;
      }
      ans[i] = ans[i - 1] + cnt;
    }
    for (int i = n - 2, cnt = 0, s = 0; i >= 0; --i) {
      if (boxes.charAt(i + 1) == '1') {
        ++cnt;
      }
      s += cnt;
      ans[i] += s;
    }
    return ans;
  }
}
class Solution {
public:
  vector<int> minOperations(string boxes) {
    int n = boxes.size();
    vector<int> ans(n);
    for (int i = 1, cnt = 0; i < n; ++i) {
      cnt += boxes[i - 1] == '1';
      ans[i] = ans[i - 1] + cnt;
    }
    for (int i = n - 2, cnt = 0, s = 0; ~i; --i) {
      cnt += boxes[i + 1] == '1';
      s += cnt;
      ans[i] += s;
    }
    return ans;
  }
};
func minOperations(boxes string) []int {
  n := len(boxes)
  ans := make([]int, n)
  for i, cnt := 1, 0; i < n; i++ {
    if boxes[i-1] == '1' {
      cnt++
    }
    ans[i] = ans[i-1] + cnt
  }
  for i, cnt, s := n-2, 0, 0; i >= 0; i-- {
    if boxes[i+1] == '1' {
      cnt++
    }
    s += cnt
    ans[i] += s
  }
  return ans
}
function minOperations(boxes: string): number[] {
  const n = boxes.length;
  const ans = new Array(n).fill(0);
  for (let i = 1, count = 0; i < n; i++) {
    if (boxes[i - 1] === '1') {
      count++;
    }
    ans[i] = ans[i - 1] + count;
  }
  for (let i = n - 2, count = 0, sum = 0; i >= 0; i--) {
    if (boxes[i + 1] === '1') {
      count++;
    }
    sum += count;
    ans[i] += sum;
  }
  return ans;
}
impl Solution {
  pub fn min_operations(boxes: String) -> Vec<i32> {
    let s = boxes.as_bytes();
    let n = s.len();
    let mut ans = vec![0; n];
    let mut count = 0;
    for i in 1..n {
      if s[i - 1] == b'1' {
        count += 1;
      }
      ans[i] = ans[i - 1] + count;
    }
    let mut sum = 0;
    count = 0;
    for i in (0..n - 1).rev() {
      if s[i + 1] == b'1' {
        count += 1;
      }
      sum += count;
      ans[i] += sum;
    }
    ans
  }
}
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* minOperations(char* boxes, int* returnSize) {
  int n = strlen(boxes);
  int* ans = malloc(sizeof(int) * n);
  memset(ans, 0, sizeof(int) * n);
  for (int i = 1, count = 0; i < n; i++) {
    if (boxes[i - 1] == '1') {
      count++;
    }
    ans[i] = ans[i - 1] + count;
  }
  for (int i = n - 2, count = 0, sum = 0; i >= 0; i--) {
    if (boxes[i + 1] == '1') {
      count++;
    }
    sum += count;
    ans[i] += sum;
  }
  *returnSize = n;
  return ans;
}

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

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

发布评论

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