题目描述
还有一些个题目提示
提示:
2 <= nums.length <= 105
-2 * 109 <= nums[i] <= 2 * 109
0 <= d <= 109
nums.length == s.length
s
只包含'L'
和'R'
。nums[i]
互不相同。
题目分析与思路
机器人是无差别的,因此,仔细思考这个问题,撞上的条件是——下标一直或者说在同一个格子里,然后分别掉头跑路。换个思路,撞上的时候身份互换一下,即接着按照原方向前进。这样看机器人撞不撞上都无所谓。
初始代码
一开始写的代码如下,但是显示超出时间限制了,时间复杂度太高了。
class Solution {
public:
int sumDistance(vector<int>& nums, string s, int d)
{
static int mod = 1e9 + 7;
int n=nums.size();
vector<long long> pos(n);
for(int i=0;i<n;i++)
{
if(s[i]=='R')
pos[i]=(long long)nums[i]+d;
else
pos[i]=(long long)nums[i]-d;
}
sort(pos.begin(),pos.end());
long long distance=0;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
long long D=abs(pos[j]-pos[i])%mod;
distance+=D;
distance=distance%mod;
}
}
return distance;
}
};
优化过后的方法
优化方法:数学计算出两两求差过程中每个元素出现多少次。
排完序后,第K个位置上的元素,要减去前面的元素出现K次(0,1,2,3…K-1);后面的元素要减去它,即减去[(n-1)-k]次。
即
for(int i=0;i<n;i++)
{
distance+=(2*i+1-n)*pos[i];
distance%=mod;
}
class Solution {
public:
int sumDistance(vector<int>& nums, string s, int d)
{
static int mod = 1e9 + 7;
int n=nums.size();
vector<long long> pos(n);
for(int i=0;i<n;i++)
{
if(s[i]=='R')
pos[i]=(long long)nums[i]+d;
else
pos[i]=(long long)nums[i]-d;
}
sort(pos.begin(),pos.end());
long long distance=0;
for(int i=0;i<n;i++)
{
distance+=(2*i+1-n)*pos[i];
distance%=mod;
}
return distance;
}
};
注意事项
1.需要注意取模
2.数组下标计算