2731. 移动机器人 【有序数组 两两差值求和】

17 阅读1分钟

2731. 移动机器人

注意: s 是每个机器人运动的方向,相遇即转头且机器人无区分 等效于 错身 继续往前。

image.png

class Solution:
    def sumDistance(self, nums: List[int], s: str, d: int) -> int:
        # 相撞后直接 掉头,而机器人之间无区分,等效于 机器人 错身 继续往前了。
        # 需要 增减的数
        n = len(nums)
        pos = [nums[i] - d if s[i] == 'L' else nums[i] + d for i in range(n)]
        pos.sort()  # 方便后续求和
        return sum([(pos[i] - pos[i - 1]) * i * (n - i) for i in range(1, n)]) % (10**9 + 7)
class Solution {
public:
    static constexpr int mod = 1e9 + 7;
    int sumDistance(vector<int>& nums, string s, int d) {
        int n = nums.size();
        vector<long long> pos(n);
        for (int i = 0; i < n; ++i){
            if (s[i] == 'L'){
                pos[i] = (long long) nums[i] - d;
            }else{
                pos[i] = (long long) nums[i] + d;
            }
        }   

        sort(pos.begin(), pos.end());
        long long res = 0;
        for (int i = 1; i < n; ++i){
            res += 1ll * (pos[i] - pos[i - 1]) * i  % mod  * (n - i) % mod; // 三重 求模
            res %= mod;
        }     
        return res;
    }
};

image.png