给你一个正整数数组 nums 。 同时给你一个长度为 m 的整数数组 queries 。第 i 个查询中,你需要将 nums 中所有元素变成 queries[i] 。你可以执行以下操作 任意 次: 将数组里一个元素 增大 或者 减小 1 。 请你返回一个长度为 m 的数组 answer ,其中 answer[i]是将 nums 中所有元素变成 queries[i] 的 最少 操作次数。 注意,每次查询后,数组变回最开始的值。 给出一个时间复杂度较小的C代码
时间: 2023-05-30 21:01:41 浏览: 76
给你一个包含n个整数的数组nums,并检查nums中是否有三个元素a、b和c使a+b+c=0?请查找总和为0且不重复的所有
思路:对于每个查询 i,遍历数组 nums,计算每个元素需要改变的次数,累加得到总次数。同时记录数组 nums 的最大值和最小值,因为如果 queries[i] 超出这个范围,那么无法通过操作将其变为 nums 中的元素。
代码:
int abs(int a){
return a>0?a:-a;
}
int* minOperations(int* nums, int numsSize, int* queries, int queriesSize, int* returnSize){
int* res = (int*)malloc(sizeof(int)*queriesSize);
*returnSize = queriesSize;
for(int i=0;i<queriesSize;i++){
int q = queries[i];
int max_num = nums[0], min_num = nums[0];
int cnt = 0;
for(int j=0;j<numsSize;j++){
int diff = q - nums[j];
if(diff<0 && q<min_num) break;
if(diff>0 && q>max_num) break;
cnt += abs(diff);
max_num = fmax(max_num, nums[j]);
min_num = fmin(min_num, nums[j]);
}
if(q<min_num || q>max_num) res[i] = -1;
else res[i] = cnt;
}
return res;
}
阅读全文