You are given an array nums
of length n
. You are also given an integer k
.
You perform the following operation on nums
once:
nums[i..j]
where 0 <= i <= j <= n - 1
.x
and add x
to all the elements in nums[i..j]
.Find the maximum frequency of the value k
after the operation.
For example:
nums = [1,2,3,4,5,6], k = 1
After adding -5 to nums[2..5]
, 1 has a frequency of 2 in [1, 2, -2, -1, 0, 1]
. Thus the output should be 2.
nums = [10,2,3,4,5,5,4,3,2,2], k = 10
After adding 8 to nums[1..9]
, 10 has a frequency of 4 in [10, 10, 11, 12, 13, 13, 12, 11, 10, 10]
. Thus the output should be 4.
Constraints:
1 <= n == nums.length <= 10^5
1 <= nums[i] <= 50
1 <= k <= 50
The naive solution iterates through all possible subarrays and all possible values of x
. For each subarray, it adds x
to all elements in the subarray and calculates the frequency of k
. The maximum frequency is then returned.
def max_frequency_naive(nums, k):
n = len(nums)
max_freq = 0
for i in range(n):
for j in range(i, n):
for x in range(-50, 51): # Iterate through possible values of x
temp_nums = nums[:]
for l in range(i, j + 1):
temp_nums[l] += x
freq = temp_nums.count(k)
max_freq = max(max_freq, freq)
return max_freq
O(n^3 * range_of_x). We iterate through all possible subarrays (O(n^2)), then for each subarray we iterate through all possible values of x. Then, we iterate through the array to get the frequency of k which is O(n). Thus, the time complexity is O(n^2 * range_of_x * n) == O(n^3 * range_of_x).
O(n), due to the creation of temp_nums.
A more optimal solution involves iterating through all possible subarrays and calculating the x
needed to transform an element within that subarray into k
. Then, by using another loop, we can determine the overall frequency after applying x
on the subarray. This avoids needing to test many x
values.
def max_frequency_optimal(nums, k):
n = len(nums)
max_freq = 0
for i in range(n):
for j in range(i, n):
# Iterate through all subarrays
temp_nums = nums[:]
# Iterate through the elements of the subarray
for l in range(i, j + 1):
x = k - nums[l] # find the x that would transform nums[l] to k
temp_nums = nums[:]
# Update the subarray with x
for m in range(i, j + 1):
temp_nums[m] += x
freq = temp_nums.count(k)
max_freq = max(max_freq, freq)
return max_freq
O(n^3). We iterate through all possible subarrays (O(n^2)). Then, for each subarray, we iterate through it again (O(n)), calculate the frequency and update the max. So O(n^2 * n) = O(n^3).
O(n) to store temp_nums.
n >= 1
, so we don't need to worry about an empty array.k
in nums
before any operations.x
from -50 to 50, as nums[i]
and k
are within the range of 1 to 50. The optimal solution does not require an explicit x.