Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Solution {
- private boolean ableToGetFrequency(int proposedLength, int numLength, long k, int[] nums, long[] prefixSum) {
- int L = 0, R = 0;
- while(R < numLength) {
- int subArrayLength = (R - L + 1);
- if(subArrayLength < proposedLength) {
- R += 1;
- } else {
- int medianIndex = L + (subArrayLength / 2);
- long leftHalfPrefixSum = prefixSum[medianIndex];
- if(L > 0) {
- leftHalfPrefixSum -= prefixSum[L - 1];
- }
- long rightHalfPrefixSum = prefixSum[R];
- rightHalfPrefixSum -= prefixSum[medianIndex];
- long requiredOperations = ((long)nums[medianIndex] * (medianIndex - L + 1)) - leftHalfPrefixSum;
- requiredOperations += rightHalfPrefixSum - ((long)nums[medianIndex] * (R - medianIndex));
- if(requiredOperations <= k) {
- return true;
- }
- L += 1;
- R += 1;
- }
- }
- return false;
- }
- public int maxFrequencyScore(int[] nums, long k) {
- int numLength = nums.length;
- Arrays.sort(nums);
- long[] prefixSum = new long[numLength];
- for(int i = 0; i < numLength; i++) {
- prefixSum[i] = nums[i];
- if(i > 0) prefixSum[i] += prefixSum[i - 1];
- }
- int result = 1;
- int L = 1, R = numLength;
- while (L <= R) {
- int mid = L + ((R - L) >> 1);
- if(ableToGetFrequency(mid, numLength, k, nums, prefixSum)) {
- result = mid;
- L = mid + 1;
- } else {
- R = mid - 1;
- }
- }
- return result;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement