• 力扣每日一题


    2731. 移动机器人 - 力扣(LeetCode) 

    暴力模拟如下 :

    1. class Solution {
    2. public:
    3. const int mod = 1e9 + 7;
    4. int sumDistance(vector<int>& nums, string s, int d)
    5. {
    6. using i64 = long long;
    7. int n = nums.size();
    8. while(d--)
    9. {
    10. for(int i = 0;i < n;i++)
    11. {
    12. nums[i] += (s[i] == 'R' ? 1 : -1);
    13. if(i && nums[i] == nums[i - 1])
    14. swap(s[i], s[i - 1]);
    15. }
    16. }
    17. i64 ans = 0;
    18. for(int i = 0; i < n; i++)
    19. {
    20. for(int j = i + 1;j < n;j++)
    21. ans = (ans % mod + (abs(v[i] - v[j]) % mod)) % mod;
    22. }
    23. return ans;
    24. }
    25. };

     

    看数据范围d == 1e9

    可见该题解在处理d秒时的时间复杂度应当不超过O(n)

    因此:上解需要优化

     当我们碰撞的时候:

    1. if(i && nums[i] == nums[i - 1])
    2. swap(s[i], s[i - 1]);

    交换俩者的方向,那也等于交换俩个机器人的效果,于是我们可以忽略碰撞影响,直接求d秒无碰撞的相对位置即可。

    举一个简单的例子:

    A = 0 == >> R

    B = 2 == >> L

    d = 10;

    在1秒的时候交换方向

    A = 1 == >> L

    B = 1 == >> R

    10s后:

    A = -8 == >> L

    B =  10 == >> R;

    直接求相对距离

    A = 10 == >> R

    B = -8 == >> L

    因此直接求d秒无碰撞的相对位置对最终答案无影响

    此时: 由数据范围nums最大可为2e9,d 最大为1e9 >> 2147483647

    爆int,需要i64数据类型进行存储

     可得:

    1. class Solution {
    2. public:
    3. const int mod = 1e9 + 7;
    4. int sumDistance(vector<int>& nums, string s, int d)
    5. {
    6. using i64 = long long;
    7. int n = nums.size();
    8. vector v(n);
    9. for(int i = 0;i < n; i++)
    10. v[i] = nums[i] + (s[i] == 'R' ? d : -d);
    11. i64 ans = 0;
    12. for(int i = 0; i < n; i++)
    13. {
    14. for(int j = i + 1;j < n;j++)
    15. ans = (ans % mod + (abs(v[i] - v[j]) % mod)) % mod;
    16. }
    17. return ans;
    18. }
    19. };

    再看数据范围 

     

     n的范围为[2,1e5]  

    仅看ans求值的第一轮循环1e5 * (1e5 - 1)显然超时

    对于ans的求值过程有这么一种情况

    对于任意 i [0,n]前有i个数,后有n - i个数 == >> i * (n - i)个数对都会进行一次加(v[i] - v[i- 1])的值

    可得:

    1. class Solution {
    2. public:
    3. const int mod = 1e9 + 7;
    4. int sumDistance(vector<int>& nums, string s, int d)
    5. {
    6. using i64 = long long;
    7. int n = nums.size();
    8. vector v(n);
    9. for(int i = 0;i < n; i++)
    10. v[i] = nums[i] + (s[i] == 'R' ? d : -d);
    11. sort(v.begin(),v.end());
    12. i64 ans = 0;
    13. for (int i = 1; i < n; i++)
    14. {
    15. ans = ((v[i] - v[i - 1]) * i % mod * (n - i) + ans) % mod;
    16. }
    17. return ans;
    18. }
    19. };

     

  • 相关阅读:
    Vue3 中使用provide和reject
    Spark系列之SparkSubmit提交任务到YARN
    【保姆级】新机器部署MySQL
    Web安全:Vulfocus 靶场搭建.(漏洞集成平台)
    The Last Naruto,兼容IE11的vue脚手架
    vue2项目从0搭建(二):配置代理,登录功能和菜单权限
    CyclicBarrier和CountDownLatch
    防火墙基础之H3C防火墙分支与分支之间双向地址转换
    mysql下载和安装,使用
    唯品会关键字搜索商品API接口(item_search-按关键字搜索唯品会商品API接口),唯品会API接口
  • 原文地址:https://blog.csdn.net/shuyuan12346/article/details/133742327