2602. 使数组元素全部相等的最少操作次数
思路:先对数组nums进行升序排序,然后获得nums数组的前缀和。在for循环遍历queries时,用二分查找找到小于queries[i]元素的下一个元素下标。然后通过预先处理好的前缀和来计算需要进行的操作次数。
class Solution {
public:
vector<long long> minOperations(vector<int>& nums, vector<int>& queries) {
sort(nums.begin(),nums.end());
int n=nums.size();
vector<long long> v(queries.size(),0);
vector<long long> sum(n,0);
sum[0]=nums[0];
for(int i=1;i<n;i++){
sum[i]=sum[i-1]+nums[i];
}
for(int i=0;i<queries.size();i++){
//先处理掉都是<=和>=的情况,方便后面计算中间的时候不会数组越界
if(nums[0]>=queries[i]|| nums[n-1]<=queries[i]){
v[i]=abs(sum[n-1]-(long long)queries[i]*n);
continue;
}
int l=0,r=n-1;
while(l<r){
int mid=(l+r)/2;
if(nums[mid]<queries[i]) l=mid+1;
else r=mid;
}
v[i]=((long long)queries[i]*l-sum[l-1])+(sum[n-1]-sum[l-1]-(long long)queries[i]*(n-l));
}
return v;
}
};