Welcome to Subscribe On Youtube
Formatted question description: https://leetcode.ca/all/2524.html
2524. Maximum Frequency Score of a Subarray
Description
You are given an integer array nums
and a positive integer k
.
The frequency score of an array is the sum of the distinct values in the array raised to the power of their frequencies, taking the sum modulo 109 + 7
.
- For example, the frequency score of the array
[5,4,5,7,4,4]
is(43 + 52 + 71) modulo (109 + 7) = 96
.
Return the maximum frequency score of a subarray of size k
in nums
. You should maximize the value under the modulo and not the actual value.
A subarray is a contiguous part of an array.
Example 1:
Input: nums = [1,1,1,2,1,2], k = 3 Output: 5 Explanation: The subarray [2,1,2] has a frequency score equal to 5. It can be shown that it is the maximum frequency score we can have.
Example 2:
Input: nums = [1,1,1,1,1,1], k = 4 Output: 1 Explanation: All the subarrays of length 4 have a frequency score equal to 1.
Constraints:
1 <= k <= nums.length <= 105
1 <= nums[i] <= 106
Solutions
-
class Solution { public int maxFrequencyScore(int[] nums, int k) { final int mod = (int) 1e9 + 7; Map<Integer, Integer> cnt = new HashMap<>(); for (int i = 0; i < k; ++i) { cnt.put(nums[i], cnt.getOrDefault(nums[i], 0) + 1); } long cur = 0; for (var e : cnt.entrySet()) { cur = (cur + qmi(e.getKey(), e.getValue(), mod)) % mod; } long ans = cur; for (int i = k; i < nums.length; ++i) { int a = nums[i - k]; int b = nums[i]; if (a != b) { if (cnt.getOrDefault(b, 0) > 0) { cur += (b - 1) * qmi(b, cnt.get(b), mod) % mod; } else { cur += b; } if (cnt.getOrDefault(a, 0) > 1) { cur -= (a - 1) * qmi(a, cnt.get(a) - 1, mod) % mod; } else { cur -= a; } cur = (cur + mod) % mod; cnt.put(b, cnt.getOrDefault(b, 0) + 1); cnt.put(a, cnt.getOrDefault(a, 0) - 1); ans = Math.max(ans, cur); } } return (int) ans; } long qmi(long a, long k, long p) { long res = 1; while (k != 0) { if ((k & 1) == 1) { res = res * a % p; } k >>= 1; a = a * a % p; } return res; } }
-
class Solution { public: int maxFrequencyScore(vector<int>& nums, int k) { unordered_map<int, int> cnt; for (int i = 0; i < k; ++i) { cnt[nums[i]]++; } long cur = 0; const int mod = 1e9 + 7; for (auto& [k, v] : cnt) { cur = (cur + qmi(k, v, mod)) % mod; } long ans = cur; for (int i = k; i < nums.size(); ++i) { int a = nums[i - k], b = nums[i]; if (a != b) { cur += cnt[b] ? (b - 1) * qmi(b, cnt[b], mod) % mod : b; cur -= cnt[a] > 1 ? (a - 1) * qmi(a, cnt[a] - 1, mod) % mod : a; cur = (cur + mod) % mod; ans = max(ans, cur); cnt[b]++; cnt[a]--; } } return ans; } long qmi(long a, long k, long p) { long res = 1; while (k != 0) { if ((k & 1) == 1) { res = res * a % p; } k >>= 1; a = a * a % p; } return res; } };
-
class Solution: def maxFrequencyScore(self, nums: List[int], k: int) -> int: mod = 10**9 + 7 cnt = Counter(nums[:k]) ans = cur = sum(pow(k, v, mod) for k, v in cnt.items()) % mod i = k while i < len(nums): a, b = nums[i - k], nums[i] if a != b: cur += (b - 1) * pow(b, cnt[b], mod) if cnt[b] else b cur -= (a - 1) * pow(a, cnt[a] - 1, mod) if cnt[a] > 1 else a cur %= mod cnt[b] += 1 cnt[a] -= 1 ans = max(ans, cur) i += 1 return ans
-
func maxFrequencyScore(nums []int, k int) int { cnt := map[int]int{} for _, v := range nums[:k] { cnt[v]++ } cur := 0 const mod int = 1e9 + 7 for k, v := range cnt { cur = (cur + qmi(k, v, mod)) % mod } ans := cur for i := k; i < len(nums); i++ { a, b := nums[i-k], nums[i] if a != b { if cnt[b] > 0 { cur += (b - 1) * qmi(b, cnt[b], mod) % mod } else { cur += b } if cnt[a] > 1 { cur -= (a - 1) * qmi(a, cnt[a]-1, mod) % mod } else { cur -= a } cur = (cur + mod) % mod ans = max(ans, cur) cnt[b]++ cnt[a]-- } } return ans } func max(a, b int) int { if a > b { return a } return b } func qmi(a, k, p int) int { res := 1 for k != 0 { if k&1 == 1 { res = res * a % p } k >>= 1 a = a * a % p } return res }