Advertisement
i_love_rao_khushboo

2968. Apply Operations to Maximize Frequency Score

Dec 23rd, 2023
645
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.80 KB | None | 0 0
  1. class Solution {
  2.     private boolean ableToGetFrequency(int proposedLength, int numLength, long k, int[] nums, long[] prefixSum) {
  3.         int L = 0, R = 0;
  4.  
  5.         while(R < numLength) {
  6.             int subArrayLength = (R - L + 1);
  7.  
  8.             if(subArrayLength < proposedLength) {
  9.                 R += 1;
  10.             } else {
  11.                 int medianIndex = L + (subArrayLength / 2);
  12.                 long leftHalfPrefixSum = prefixSum[medianIndex];
  13.                 if(L > 0) {
  14.                     leftHalfPrefixSum -= prefixSum[L - 1];
  15.                 }
  16.  
  17.                 long rightHalfPrefixSum = prefixSum[R];
  18.                 rightHalfPrefixSum -= prefixSum[medianIndex];
  19.  
  20.                 long requiredOperations = ((long)nums[medianIndex] * (medianIndex - L + 1)) - leftHalfPrefixSum;
  21.                 requiredOperations += rightHalfPrefixSum - ((long)nums[medianIndex] * (R - medianIndex));
  22.  
  23.                 if(requiredOperations <= k) {
  24.                     return true;
  25.                 }
  26.  
  27.                 L += 1;
  28.                 R += 1;
  29.             }
  30.         }
  31.  
  32.         return false;
  33.     }
  34.  
  35.     public int maxFrequencyScore(int[] nums, long k) {
  36.         int numLength = nums.length;
  37.  
  38.         Arrays.sort(nums);
  39.  
  40.         long[] prefixSum = new long[numLength];
  41.         for(int i = 0; i < numLength; i++) {
  42.             prefixSum[i] = nums[i];
  43.             if(i > 0) prefixSum[i] += prefixSum[i - 1];
  44.         }
  45.  
  46.         int result = 1;
  47.         int L = 1, R = numLength;
  48.  
  49.         while (L <= R) {
  50.             int mid = L + ((R - L) >> 1);
  51.  
  52.             if(ableToGetFrequency(mid, numLength, k, nums, prefixSum)) {
  53.                 result = mid;
  54.                 L = mid + 1;
  55.             } else {
  56.                 R = mid - 1;
  57.             }
  58.         }
  59.  
  60.         return result;
  61.     }
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement