Woodyiiiiiii / LeetCode

My private record of Leetcode solution

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Leetcode 2731. Movement of Robots

Woodyiiiiiii opened this issue · comments

2731. Movement of Robots

2731. Movement of Robots

类似问题:
735. Asteroid Collision
2751. Robot Collisions

这道题是双周赛第三题。很好的思维题

问题难点主要是如何解决碰撞问题及碰撞后的位置问题。既然知道了答案,这里我就尝试正推一下,看看思路如何想到真正的解法。

不妨从时间复杂度出发,最多排序下。接着只能在O(n)条件下完成了,而且d这么大,所以也不能一个个研究了。然后题目求的是两两之间的距离,所以我们最好知道所有robots最后的位置。但碰撞有很多种情况,如何计算robots的位置呢?从最简单的情况考虑,考虑robots只碰撞一次,碰撞后两球往相反的位置移动,我们可以假设robots并没改变方向,仍按照之前的方向移动,因为我们只关注robots的位置,不需要对应,这样就能解决robots的位置了。

既然知道了每个robot的位置,接下来就是求两两之间的距离了。只能在O(n)下完成,假设一次遍历到位置j,其与之前的robots位置计算是nums[j] - nums[j-1] + nums[j] - nums[j-2]...,可以简化成j个nums[j]相乘再减去之前的位置前缀和。

class Solution {
    public int sumDistance(int[] nums, String s, int d) {
        int n = nums.length;
        List<Integer> positions = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            int position = s.charAt(i) == 'L' ? nums[i] - d : nums[i] + d;
            positions.add(position);
        }
        Collections.sort(positions);
        final int MOD = (int) (1e9 + 7);
        long ans = 0, preSum = positions.get(0);
        for (int i = 1; i < positions.size(); i++) {
            ans = (ans + (long) positions.get(i) * i - preSum + MOD) % MOD;
            preSum += positions.get(i);
        }
        return (int)ans;
    }
}