1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| class Solution { public List<Long> minOperations(int[] nums, int[] queries) { Arrays.sort(nums); List<Long> res = new ArrayList<>(); long s = 0, q1 = queries[0]; long[] preSum = new long[nums.length + 1]; int index = 1; for (int x : nums) { s += Math.abs(x - q1); preSum[index] = preSum[index++ - 1] + x; } res.add(s); for (int j = 1; j < queries.length; ++j) { int i = findIndex2(queries[j - 1], nums); int k = findIndex(queries[j], nums); long middleSum = preSum[k] - preSum[i + 1]; int size = k - i - 1; long diff = ((long) queries[j] * size - middleSum) - (middleSum - (long) queries[j - 1] * size); int left = i + 1; int right = nums.length - k; s += (left - right) * ((long) queries[j] - queries[j - 1]) + diff; res.add(s); } return res; }
private int findIndex(int q, int[] nums) { int l = 0, r = nums.length - 1; while (l <= r) { int mid = (l + r) >> 1; if (nums[mid] >= q) r = mid - 1; else l = mid + 1; } return l; }
private int findIndex2(int q, int[] nums) { int l = 0, r = nums.length - 1; while (l <= r) { int mid = (l + r) >> 1; if (nums[mid] > q) r = mid - 1; else l = mid + 1; } return r; } }
|