返回介绍

solution / 2700-2799 / 2731.Movement of Robots / README_EN

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

2731. Movement of Robots

中文文档

Description

Some robots are standing on an infinite number line with their initial coordinates given by a 0-indexed integer array nums and will start moving once given the command to move. The robots will move a unit distance each second.

You are given a string s denoting the direction in which robots will move on command. 'L' means the robot will move towards the left side or negative side of the number line, whereas 'R' means the robot will move towards the right side or positive side of the number line.

If two robots collide, they will start moving in opposite directions.

Return _the sum of distances between all the pairs of robots _d _seconds after the command. _Since the sum can be very large, return it modulo 109 + 7.

Note:

  • For two robots at the index i and j, pair (i,j) and pair (j,i) are considered the same pair.
  • When robots collide, they instantly change their directions without wasting any time.
  • Collision happens when two robots share the same place in a moment.
    • For example, if a robot is positioned in 0 going to the right and another is positioned in 2 going to the left, the next second they'll be both in 1 and they will change direction and the next second the first one will be in 0, heading left, and another will be in 2, heading right.
    • For example, if a robot is positioned in 0 going to the right and another is positioned in 1 going to the left, the next second the first one will be in 0, heading left, and another will be in 1, heading right.

 

Example 1:

Input: nums = [-2,0,2], s = "RLL", d = 3
Output: 8
Explanation: 
After 1 second, the positions are [-1,-1,1]. Now, the robot at index 0 will move left, and the robot at index 1 will move right.
After 2 seconds, the positions are [-2,0,0]. Now, the robot at index 1 will move left, and the robot at index 2 will move right.
After 3 seconds, the positions are [-3,-1,1].
The distance between the robot at index 0 and 1 is abs(-3 - (-1)) = 2.
The distance between the robot at index 0 and 2 is abs(-3 - 1) = 4.
The distance between the robot at index 1 and 2 is abs(-1 - 1) = 2.
The sum of the pairs of all distances = 2 + 4 + 2 = 8.

Example 2:

Input: nums = [1,0], s = "RL", d = 2
Output: 5
Explanation: 
After 1 second, the positions are [2,-1].
After 2 seconds, the positions are [3,-2].
The distance between the two robots is abs(-2 - 3) = 5.

 

Constraints:

  • 2 <= nums.length <= 105
  • -2 * 109 <= nums[i] <= 2 * 109
  • 0 <= d <= 109
  • nums.length == s.length 
  • s consists of 'L' and 'R' only
  • nums[i] will be unique.

Solutions

Solution 1: Quick thinking + Sorting

After two robots collide, they will immediately change direction, which is equivalent to the two robots continuing to move in their original direction. Therefore, we traverse the array $nums$, and according to the instructions in the string $s$, we add or subtract $d$ from the position of each robot, and then sort the array $nums$.

Next, we enumerate the position of each robot from small to large, and calculate the sum of the distances between the current robot and all robots in front, which is the answer.

The time complexity is $O(n \times \log n)$ and the space complexity is $O(n)$, where $n$ is the number of robots.

class Solution:
  def sumDistance(self, nums: List[int], s: str, d: int) -> int:
    mod = 10**9 + 7
    for i, c in enumerate(s):
      nums[i] += d if c == "R" else -d
    nums.sort()
    ans = s = 0
    for i, x in enumerate(nums):
      ans += i * x - s
      s += x
    return ans % mod
class Solution {
  public int sumDistance(int[] nums, String s, int d) {
    int n = nums.length;
    long[] arr = new long[n];
    for (int i = 0; i < n; ++i) {
      arr[i] = (long) nums[i] + (s.charAt(i) == 'L' ? -d : d);
    }
    Arrays.sort(arr);
    long ans = 0, sum = 0;
    final int mod = (int) 1e9 + 7;
    for (int i = 0; i < n; ++i) {
      ans = (ans + i * arr[i] - sum) % mod;
      sum += arr[i];
    }
    return (int) ans;
  }
}
class Solution {
public:
  int sumDistance(vector<int>& nums, string s, int d) {
    int n = nums.size();
    vector<long long> arr(n);
    for (int i = 0; i < n; ++i) {
      arr[i] = 1LL * nums[i] + (s[i] == 'L' ? -d : d);
    }
    sort(arr.begin(), arr.end());
    long long ans = 0;
    long long sum = 0;
    const int mod = 1e9 + 7;
    for (int i = 0; i < n; ++i) {
      ans = (ans + i * arr[i] - sum) % mod;
      sum += arr[i];
    }
    return ans;
  }
};
func sumDistance(nums []int, s string, d int) (ans int) {
  for i, c := range s {
    if c == 'R' {
      nums[i] += d
    } else {
      nums[i] -= d
    }
  }
  sort.Ints(nums)
  sum := 0
  const mod int = 1e9 + 7
  for i, x := range nums {
    ans = (ans + i*x - sum) % mod
    sum += x
  }
  return
}
function sumDistance(nums: number[], s: string, d: number): number {
  const n = nums.length;
  for (let i = 0; i < n; ++i) {
    nums[i] += s[i] === 'L' ? -d : d;
  }
  nums.sort((a, b) => a - b);
  let ans = 0;
  let sum = 0;
  const mod = 1e9 + 7;
  for (let i = 0; i < n; ++i) {
    ans = (ans + i * nums[i] - sum) % mod;
    sum += nums[i];
  }
  return ans;
}

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

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

发布评论

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