-
-
Notifications
You must be signed in to change notification settings - Fork 4.5k
/
Copy path1838.c
36 lines (28 loc) · 1.07 KB
/
1838.c
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
#define max(a,b) (((a)>(b))?(a):(b))
int compare(const int* i, const int* j)
{
return *i - *j;
}
// Sort + prefix sum + windows sliding
// Runtime: O(n*log(n))
// Space: O(n)
int maxFrequency(int* nums, int numsSize, int k){
qsort(nums, numsSize, sizeof (int), (int(*) (const void*, const void*)) compare);
long* prefixSum = malloc(numsSize * sizeof(long));
prefixSum[0] = nums[0];
for(int i = 0; i < numsSize - 1; i++){
prefixSum[i + 1] = prefixSum[i] + nums[i];
}
int leftWindowPosition = 0;
int result = 0;
for(int rightWindowPosition = 0; rightWindowPosition < numsSize; rightWindowPosition++){
long rightSum = prefixSum[rightWindowPosition];
long leftSum = prefixSum[leftWindowPosition];
while ((long)nums[rightWindowPosition] * (rightWindowPosition - leftWindowPosition) - (rightSum - leftSum) > k){
leftWindowPosition += 1;
}
result = max(result, rightWindowPosition - leftWindowPosition + 1);
}
free(prefixSum);
return result;
}