Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

  • 链表

  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

  • 数学贪心

    • LCP 33. 蓄水
    • 6455. 使所有字符相等的最小成本
    • 55. 跳跃游戏
    • 2517. 礼盒的最大甜蜜度
    • 2611. 老鼠和奶酪
    • 6449. 收集巧克力
    • 1401. 圆和矩形是否有重叠
    • 2178. 拆分成最多数目的正偶数之和
    • 376. 摆动序列
    • 649. Dota2 参议院
    • 630. 课程表 III
    • 2136. 全部开花的最早一天
    • 2731. 移动机器人
      • 1.排序+找规律
  • 堆栈队列

  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 数学贪心
phan
2023-10-10
目录

2731. 移动机器人

# 2731. 移动机器人 (opens new window)

# 1.排序+找规律

本题直接暴力模拟会超时,因此需要另外找规律降低时间复杂度。

  • 题目最终需要计算机器人两两之间的距离,那么对应改变机器人的标号不会影响计算结果,只需要保证距离是正确的即可。
  • 考虑碰撞处理主要分为两种情况:
    • 当前这一秒移动后,a和b落脚在同一个坐标上inx,并改变移动方向。实际上下一秒inx+1坐标上是a还是b对最终结果不会产生影响,也就是说我们可以当作"方向没有改变"来处理。
    • 当前a和b分别位于inx和inx+1,那么下一秒移动后如果当作”方向未改变“来处理,那么就会a位于inx+1,b位于inx,和当前坐标状态相比也不会影响最终结果。

因此机器人移动时不需要处理碰撞,直接按照初始方向移动即可。问题简化为计算两两距离之和,常规做法两个for循环时间O(n平方),另一种做法是从小到大排序,观察可以发现第一个数字被减了n-1次,第二个数字被减n-2次,同时加了1次,第三个数字被减了n-3次,同时加了2次...以此类推可以只用一个循环计算,时间O(n)

class Solution {
    public int sumDistance(int[] nums, String s, int d) {
        long[] arr=new long[nums.length];
        long sum=0;
        for(int i=0;i<nums.length;i++){
            if(s.charAt(i)=='R') arr[i]=nums[i]+d;
            else arr[i]=nums[i]-d;
            sum+=arr[i];
        }
        Arrays.sort(arr);
        int n=nums.length;
        long res=0;
        for(int i=0;i<nums.length;i++){
            n--;
            sum-=arr[i];
            res=(res+sum-n*arr[i])%1000000007;
        }
        return (int)res;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
编辑 (opens new window)
#Leetcode
上次更新: 2023/12/15, 15:49:57
2136. 全部开花的最早一天
394.字符串解码

← 2136. 全部开花的最早一天 394.字符串解码→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式