From 3469e36ee02c9bb78fd0a02d733acaacd20a0f14 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Fri, 4 Aug 2023 20:03:29 +0800 Subject: [PATCH 1/2] feat: add solutions to lc problem: No.2731 No.2731.Movement of Robots --- .../2731.Movement of Robots/README.md | 96 ++++++++++++++++++- .../2731.Movement of Robots/README_EN.md | 94 +++++++++++++++++- .../2731.Movement of Robots/Solution.cpp | 19 ++++ .../2731.Movement of Robots/Solution.go | 17 ++++ .../2731.Movement of Robots/Solution.java | 17 ++++ .../2731.Movement of Robots/Solution.py | 11 +++ .../2731.Movement of Robots/Solution.ts | 15 +++ 7 files changed, 261 insertions(+), 8 deletions(-) create mode 100644 solution/2700-2799/2731.Movement of Robots/Solution.cpp create mode 100644 solution/2700-2799/2731.Movement of Robots/Solution.go create mode 100644 solution/2700-2799/2731.Movement of Robots/Solution.java create mode 100644 solution/2700-2799/2731.Movement of Robots/Solution.py create mode 100644 solution/2700-2799/2731.Movement of Robots/Solution.ts diff --git a/solution/2700-2799/2731.Movement of Robots/README.md b/solution/2700-2799/2731.Movement of Robots/README.md index 09134f8e58ca0..570ec11620669 100644 --- a/solution/2700-2799/2731.Movement of Robots/README.md +++ b/solution/2700-2799/2731.Movement of Robots/README.md @@ -21,7 +21,6 @@
  • 当机器人相撞时,它们 立即改变 它们的前进时间,这个过程不消耗任何时间。
  • 当两个机器人在同一时刻占据相同的位置时,就会相撞。

    -
  • -

     

    @@ -79,6 +77,14 @@ +**方法一:脑筋急转弯 + 排序** + +两个机器人相撞后,它们会立即改变方向,实际上相当于两个机器人继续往原来的方向移动。因此,我们遍历数组 $nums$,按照字符串 $s$ 的指令,将每个机器人的位置加上或减去 $d$,然后对数组 $nums$ 进行排序。 + +接下来,我们从小到大枚举每个机器人的位置,计算出当前机器人与前面所有机器人的距离之和,即为答案。 + +时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 是机器人的数目。 + ### **Python3** @@ -86,7 +92,17 @@ ```python - +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 ``` ### **Java** @@ -94,19 +110,89 @@ ```java - +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; + } +} ``` ### **C++** ```cpp - +class Solution { +public: + int sumDistance(vector& nums, string s, int d) { + int n = nums.size(); + vector 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; + } +}; ``` ### **Go** ```go +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 +} +``` +### **TypeScript** + +```ts +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; +} ``` ### **...** diff --git a/solution/2700-2799/2731.Movement of Robots/README_EN.md b/solution/2700-2799/2731.Movement of Robots/README_EN.md index 52c849d24baf2..c5e0a49a0801a 100644 --- a/solution/2700-2799/2731.Movement of Robots/README_EN.md +++ b/solution/2700-2799/2731.Movement of Robots/README_EN.md @@ -66,30 +66,118 @@ The distance between the two robots is abs(-2 - 3) = 5. ## 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. + ### **Python3** ```python - +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 ``` ### **Java** ```java - +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; + } +} ``` ### **C++** ```cpp - +class Solution { +public: + int sumDistance(vector& nums, string s, int d) { + int n = nums.size(); + vector 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; + } +}; ``` ### **Go** ```go +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 +} +``` +### **TypeScript** + +```ts +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; +} ``` ### **...** diff --git a/solution/2700-2799/2731.Movement of Robots/Solution.cpp b/solution/2700-2799/2731.Movement of Robots/Solution.cpp new file mode 100644 index 0000000000000..dc05a44d0cc92 --- /dev/null +++ b/solution/2700-2799/2731.Movement of Robots/Solution.cpp @@ -0,0 +1,19 @@ +class Solution { +public: + int sumDistance(vector& nums, string s, int d) { + int n = nums.size(); + vector 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; + } +}; \ No newline at end of file diff --git a/solution/2700-2799/2731.Movement of Robots/Solution.go b/solution/2700-2799/2731.Movement of Robots/Solution.go new file mode 100644 index 0000000000000..ad0f83a5f52ab --- /dev/null +++ b/solution/2700-2799/2731.Movement of Robots/Solution.go @@ -0,0 +1,17 @@ +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 +} \ No newline at end of file diff --git a/solution/2700-2799/2731.Movement of Robots/Solution.java b/solution/2700-2799/2731.Movement of Robots/Solution.java new file mode 100644 index 0000000000000..b2071c2066a39 --- /dev/null +++ b/solution/2700-2799/2731.Movement of Robots/Solution.java @@ -0,0 +1,17 @@ +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; + } +} \ No newline at end of file diff --git a/solution/2700-2799/2731.Movement of Robots/Solution.py b/solution/2700-2799/2731.Movement of Robots/Solution.py new file mode 100644 index 0000000000000..1ffa8f49a323f --- /dev/null +++ b/solution/2700-2799/2731.Movement of Robots/Solution.py @@ -0,0 +1,11 @@ +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 diff --git a/solution/2700-2799/2731.Movement of Robots/Solution.ts b/solution/2700-2799/2731.Movement of Robots/Solution.ts new file mode 100644 index 0000000000000..01490742a7024 --- /dev/null +++ b/solution/2700-2799/2731.Movement of Robots/Solution.ts @@ -0,0 +1,15 @@ +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; +} From d2117123a6aac0bc1fb45a31294e22d76c06c424 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Fri, 4 Aug 2023 20:05:22 +0800 Subject: [PATCH 2/2] chore: update config --- solution/config.py | 1 + 1 file changed, 1 insertion(+) diff --git a/solution/config.py b/solution/config.py index 7b75f51ca1dfc..b52f727c55d79 100644 --- a/solution/config.py +++ b/solution/config.py @@ -77,6 +77,7 @@ 2606, 2643, 2682, + 2731, 2788, 2790, 2800,