Solving Leetcode Interviews in Seconds with AI: Maximum Subarray Sum With Length Divisible by K
Introduction
In this blog post, we will explore how to solve the LeetCode problem "3381" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like Chatmagic, we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.
Problem Statement
You are given an array of integers nums and an integer k. Return the maximum sum of a subarray of nums, such that the size of the subarray is divisible by k. Example 1: Input: nums = [1,2], k = 1 Output: 3 Explanation: The subarray [1, 2] with sum 3 has length equal to 2 which is divisible by 1. Example 2: Input: nums = [-1,-2,-3,-4,-5], k = 4 Output: -10 Explanation: The maximum sum subarray is [-1, -2, -3, -4] which has length equal to 4 which is divisible by 4. Example 3: Input: nums = [-5,1,2,-3,4], k = 2 Output: 4 Explanation: The maximum sum subarray is [1, 2, -3, 4] which has length equal to 4 which is divisible by 2. Constraints: 1 <= k <= nums.length <= 2 * 105 -109 <= nums[i] <= 109
Explanation
Here's a solution to find the maximum sum of a subarray with a length divisible by k:
- Prefix Sum and Modulo: Calculate prefix sums modulo
k. This helps in identifying subarrays with lengths divisible byk. - Minimum Prefix Sum: Maintain an array to store the minimum prefix sum encountered for each possible modulo value. This allows us to efficiently find the maximum subarray sum divisible by
k. Iterate and Update: Iterate through the
numsarray, updating the prefix sum and the minimum prefix sum array. Calculate the potential maximum sum using the current prefix sum and the minimum prefix sum encountered so far for the same modulo.Runtime Complexity: O(n) & Storage Complexity: O(k)
Code
def max_subarray_sum_divisible_by_k(nums: list[int], k: int) -> int:
"""
Finds the maximum sum of a subarray of nums, such that the size of the subarray is divisible by k.
"""
prefix_sums = [float('inf')] * k
prefix_sums[0] = 0
current_sum = 0
max_sum = float('-inf')
for num in nums:
current_sum += num
remainder = current_sum % k
max_sum = max(max_sum, current_sum - prefix_sums[remainder])
prefix_sums[remainder] = min(prefix_sums[remainder], current_sum)
return max_sum