Problem
You are given an array nums
consisting of positive integers.
You are also given an integer array queries
of size m
. For the ith
query, you want to make all of the elements of nums
equal toqueries[i]
. You can perform the following operation on the array any number of times:
- Increase or decrease an element of the array by
1
.
Return **an array *answer
* of size m
where answer[i]
is the minimum number of operations to make all elements of nums
equal to **queries[i]
.
Note that after each query the array is reset to its original state.
Example 1:
Input: nums = [3,1,6,8], queries = [1,5]
Output: [14,10]
Explanation: For the first query we can do the following operations:
- Decrease nums[0] 2 times, so that nums = [1,1,6,8].
- Decrease nums[2] 5 times, so that nums = [1,1,1,8].
- Decrease nums[3] 7 times, so that nums = [1,1,1,1].
So the total number of operations for the first query is 2 + 5 + 7 = 14.
For the second query we can do the following operations:
- Increase nums[0] 2 times, so that nums = [5,1,6,8].
- Increase nums[1] 4 times, so that nums = [5,5,6,8].
- Decrease nums[2] 1 time, so that nums = [5,5,5,8].
- Decrease nums[3] 3 times, so that nums = [5,5,5,5].
So the total number of operations for the second query is 2 + 4 + 1 + 3 = 10.
Example 2:
Input: nums = [2,9,6,3], queries = [10]
Output: [20]
Explanation: We can increase each value in the array to 10. The total number of operations will be 8 + 1 + 4 + 7 = 20.
Constraints:
n == nums.length
m == queries.length
1 <= n, m <= 105
1 <= nums[i], queries[i] <= 109
Solution (Java)
class Solution {
public List<Long> minOperations(int[] nums, int[] queries) {
int n = nums.length;
int m = queries.length;
List<Long> list = new ArrayList<>();
Arrays.sort(nums);
long[] arr1 = new long[n];
long[] arr2 = new long[n];
arr1[0] = nums[0];
for(int i=1; i<n; i++){
arr1[i] = arr1[i-1]+nums[i];
}
arr2[n-1] = nums[n-1];
for(int i=n-2; i>=0; i--){
arr2[i] = arr2[i+1]+nums[i];
}
for(int i : queries){
long sum = 0l;
int s=0; int e = n-1;
while(s<=e){
int mid = s + (e-s)/2;
if(nums[mid] <= i){ s = mid+1; }
else{ e = mid-1; }
}
sum += s>0 ?((long)i * (long)s) - arr1[s-1] :0;
sum += s<n ?arr2[s] - ((long)(n-s) * (long)i) :0;
list.add(sum);
}
return list;
}
}
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).