Skip to main content

Command Palette

Search for a command to run...

Solving Leetcode Interviews in Seconds with AI: Maximum Side Length of a Square with Sum Less than or Equal to Threshold

Updated
2 min read

Introduction

In this blog post, we will explore how to solve the LeetCode problem "1292" 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

Given a m x n matrix mat and an integer threshold, return the maximum side-length of a square with a sum less than or equal to threshold or return 0 if there is no such square. Example 1: Input: mat = [[1,1,3,2,4,3,2],[1,1,3,2,4,3,2],[1,1,3,2,4,3,2]], threshold = 4 Output: 2 Explanation: The maximum side length of square with sum less than 4 is 2 as shown. Example 2: Input: mat = [[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2]], threshold = 1 Output: 0 Constraints: m == mat.length n == mat[i].length 1 <= m, n <= 300 0 <= mat[i][j] <= 104 0 <= threshold <= 105

Explanation

Here's the solution to the problem:

  • Prefix Sum: Utilize a prefix sum matrix to efficiently calculate the sum of any submatrix in O(1) time. This avoids redundant calculations when checking different square sizes.
  • Binary Search: Perform a binary search on the possible side lengths of the square (from 1 to min(m, n)). For each side length, check if a square exists with a sum less than or equal to the threshold using the prefix sum matrix.

  • Runtime Complexity: O(m * n * log(min(m, n))), Storage Complexity: O(m * n)

Code

    def maxSideLength(mat, threshold):
    m, n = len(mat), len(mat[0])
    prefix_sum = [[0] * (n + 1) for _ in range(m + 1)]

    for i in range(1, m + 1):
        for j in range(1, n + 1):
            prefix_sum[i][j] = prefix_sum[i - 1][j] + prefix_sum[i][j - 1] - prefix_sum[i - 1][j - 1] + mat[i - 1][j - 1]

    def check_square(side):
        for i in range(side, m + 1):
            for j in range(side, n + 1):
                square_sum = prefix_sum[i][j] - prefix_sum[i - side][j] - prefix_sum[i][j - side] + prefix_sum[i - side][j - side]
                if square_sum <= threshold:
                    return True
        return False

    left, right = 0, min(m, n)
    ans = 0
    while left <= right:
        mid = (left + right) // 2
        if check_square(mid):
            ans = mid
            left = mid + 1
        else:
            right = mid - 1

    return ans

More from this blog

C

Chatmagic blog

2894 posts