【题目】
【思路】
首先,我们知道,对于一个长度为n的数字序列nums, 的最小代价, 只会出现在这个数字序列的中位数(n为奇数)或者两个中位数(n为偶数)之间的位置。
那么,我们就可以通过先把nums的每一项分别减去0,1,2,3...,转化成求 的最小值问题。那么代价就是中位数右边的数字之和-中位数左边数字之和(即下面代码的sum2-sum1+中位数) 或者 右边中位数往右的数字和(包括中位数)-左边中位数往左的数字和(包括中位数)。
【代码】
class Solution {
public:
vector<int> numsGame(vector<int>& nums) {
int n=nums.size();
for(int i=0;i<n;i++)
nums[i]-=i;
vector<int> vec(n);
priority_queue<int, vector<int>, less<int>> q1;
priority_queue<int, vector<int>, greater<int>> q2;
long long sum1=nums[0],sum2=0;
q1.push(sum1);
for(int i=1;i<n;i++){
if(nums[i]<=q1.top()){
q1.push(nums[i]);
sum1+=nums[i];
}
else{
q2.push(nums[i]);
sum2+=nums[i];
}
if(q1.size()==q2.size()+2){
int tmp=q1.top();
q1.pop();
sum1-=tmp;
q2.push(tmp);
sum2+=tmp;
}
if(q1.size()+1==q2.size()){
int tmp=q2.top();
q2.pop();
sum2-=tmp;
q1.push(tmp);
sum1+=tmp;
}
if(q1.size()==q2.size()+1){
vec[i]=(sum2-sum1+q1.top())%1000000007;
}
else{
vec[i]=(sum2-sum1)%1000000007;
}
}
return vec;
}
};