The sliding window technique is used to find the longest subarray where elements can be incremented to make them equal using at most k
increments. We sort the array first to ensure it's easier to increment elements to become equal. We then use two pointers: one for the current end of the subarray and the other to represent the start. By checking the cost to transform the current subarray into an equal value using the difference between values and leveraging the sorted property, we can determine the maximum frequency we can achieve.
Time Complexity: O(n log n), due to sorting the array.
Space Complexity: O(1), as no extra space is used apart from variable allocations.
1#include <stdio.h>
2#include <stdlib.h>
3
4int compare(const void *a, const void *b) {
5 return (*(int *)a - *(int *)b);
6}
7
8int maxFrequency(int* nums, int numsSize, int k) {
9 qsort(nums, numsSize, sizeof(int), compare);
10 long long sum = 0;
11 int left = 0;
12 int res = 0;
13 for (int right = 0; right < numsSize; ++right) {
14 sum += nums[right];
15 while (nums[right] * (right - left + 1LL) > sum + k) {
16 sum -= nums[left++];
17 }
18 res = (res < right - left + 1) ? right - left + 1 : res;
19 }
20 return res;
21}
22
23int main() {
24 int nums[] = {1, 2, 4};
25 int k = 5;
26 int size = sizeof(nums) / sizeof(nums[0]);
27 printf("%d\n", maxFrequency(nums, size, k));
28 return 0;
29}
The C solution utilizes quick sort to sort the array and then employs two pointers, along with cumulative sums, to check the feasibility of increasing all numbers between two points to the right pointer's number with at most k
increments. The result is updated to reflect the maximum length of this window that satisfies the condition.
This approach makes use of binary search in combination with prefix sums to efficiently find the maximum frequency possible by transforming elements. We first sort the array. For a given target frequency, we check through calculating the required increment operations using a prefix sum array and binary searching over possible solutions. This allows us to leverage efficient range queries and reduce time complexity.
Time Complexity: O(n log n), because of sorting and binary search iterations.
Space Complexity: O(n), due to additional space for prefix sums.
1#include <vector>
2#include <algorithm>
3#include <numeric>
4
5class Solution {
6public:
7 bool canAchieveFrequency(std::vector<int>& nums, int freq, int k, std::vector<long long>& prefixSum) {
8 for (int end = freq - 1; end < nums.size(); ++end) {
9 long long totalNeeded = (long long)nums[end] * freq;
10 long long currentSum = prefixSum[end] - (end - freq >= 0 ? prefixSum[end - freq] : 0);
11 if (totalNeeded - currentSum <= k) return true;
12 }
13 return false;
14 }
15
16 int maxFrequency(std::vector<int>& nums, int k) {
17 std::sort(nums.begin(), nums.end());
18 std::vector<long long> prefixSum(nums.size());
19 std::partial_sum(nums.begin(), nums.end(), prefixSum.begin());
20 int left = 1, right = nums.size(), res = 1;
21 while (left <= right) {
22 int mid = left + (right - left) / 2;
23 if (canAchieveFrequency(nums, mid, k, prefixSum)) {
24 res = mid;
25 left = mid + 1;
26 } else {
27 right = mid - 1;
28 }
29 }
30 return res;
31 }
32};
33
34// Sample Usage
35#include <iostream>
36
37int main() {
38 Solution sol;
39 std::vector<int> nums = {1, 2, 4};
40 int k = 5;
41 std::cout << sol.maxFrequency(nums, k) << std::endl;
42 return 0;
43}
The C++ solution incorporates the efficient use of std::partial_sum
to calculate prefix sums and performs binary search over possible frequencies. The validity of achieving a particular frequency is checked using the prefix sums for computation of needed increments against k
.