2023/10/10

256 阅读1分钟

2731.移动机器人

题目链接

leetcode.cn/problems/mo…

解题思路:

相撞时直接改变顺序,但是题意的相撞是重合,重合后改变方向等价于不改变 -> (1,3) -> (2, 2) -> (1, 3)

所以直接加减即可 注意的是 数据范围所以开辟一个 long long 数组 来进行操作

接下来对坐标进行排序

长度的范围为 1e5 直接双循环判断会超时,需要分解,拆开来看可以看出是一个排列组合p(a, b) 的公式

(pos[i] - pos[i - 1]) * i * (n - i)

不理解,可将各个两点距离拆开成成各个相邻两点的距离多次相加即可

java code:

class Solution {
    long mod = (long) 1e9 + 7;
    public int sumDistance(int[] nums, String s, int d) {
        int size = nums.length;
        long[] pos = new long[size];
        for(int i = 0; i < size; i++){
            if(s.charAt(i) == 'R') pos[i] = nums[i] + d;
            else pos[i] = nums[i] - d;
        }
        Arrays.sort(pos);
        long res = 0;
        // 排列组合p公式推出有序相邻距离的个数
        for(int i = 1; i < size; i++){
            res = (res + (pos[i] - pos[i - 1]) * i % mod * (size - i) % mod) % mod;
        }
        return (int) res;
    }
}

c++ code:

typedef long long LL;
class Solution {
public:
LL mod = (LL) 1e9 + 7;
int sumDistance(vector<int>& nums, string s, int d) {
    int n = nums.size();
    vector<LL> pos(n);
    for(int i = 0; i < n; i++){
        if(s[i] == 'R') pos[i] = nums[i] + d;
        else pos[i] = nums[i] - d;
    }
    sort(pos.begin(), pos.end());
    LL res = 0;
    for(int i = 1; i < n; i++){
        res = (res + (pos[i] - pos[i - 1]) * i % mod * (n - i) % mod) % mod;
    }
    return (int)res;
}
};