注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
一道中等题,可以使用二分和sliding window,我用的二分,过不了,自己认为逻辑没有错误,麻烦大佬帮忙看下
public int maxFrequency(int[] nums, int k) {
Arrays.sort(nums);
int n = nums.length;
int ret = 0;
long[] sum = new long[n];
for(int i = 1; i < n; i++) {
sum[i] = (long)i * (long)(nums[i] - nums[i-1]) + sum[i-1];
}
for(int i = 0; i < n; i++) {
ret = Math.max(ret, bs(sum, i, k));
}
return ret;
}
private int bs(long[] sum, int cur, int k) {
if(sum[cur] <= k) return cur + 1;
int hi = cur, lo = 0;
int mid;
int ans = 1;
while(lo <= hi) {
mid = lo + ((hi - lo) >> 1);
if(sum[cur] - sum[mid] > k) lo = mid + 1;
else {
ans = Math.max(ans, cur - mid + 1);
hi = mid - 1;
}
}
return ans;
}
|