Bird
Raised Fist0
Interview PrepmatricesmediumAmazonGoogle

Maximum Sum of an Hourglass

Choose your preparation mode4 modes available
📋
Problem

Imagine analyzing satellite images where you want to find the region shaped like an hourglass with the highest total intensity to detect hotspots.

Given a 2D integer matrix of size n x m, find the maximum sum of values forming an hourglass shape. An hourglass is defined as a subset of values with indices forming this pattern: a b c d e f g Return the maximum hourglass sum found in the matrix.

3 ≤ n, m ≤ 1000-10^6 ≤ matrix[i][j] ≤ 10^6
Edge cases: Matrix with all negative numbers → maximum sum is the least negative hourglassMatrix with minimum size 3x3 → only one hourglass possibleMatrix with large positive and negative values → test integer overflow handling
</>
IDE
def max_hourglass_sum(matrix: list[list[int]]) -> int:public int maxHourglassSum(int[][] matrix)int maxHourglassSum(vector<vector<int>>& matrix)function maxHourglassSum(matrix)
def max_hourglass_sum(matrix):
    # Write your solution here
    pass
class Solution {
    public int maxHourglassSum(int[][] matrix) {
        // Write your solution here
        return 0;
    }
}
#include <vector>
using namespace std;

int maxHourglassSum(vector<vector<int>>& matrix) {
    // Write your solution here
    return 0;
}
function maxHourglassSum(matrix) {
    // Write your solution here
}
Coming soon
0/9
Common Bugs to Avoid
Wrong: 0Initializing max sum to 0 instead of -inf causes incorrect max when all sums are negative.✅ Initialize max_sum = float('-inf') (Python) or Integer.MIN_VALUE (Java) before loops.
Wrong: Sum of entire 3x3 block instead of hourglassSumming all 9 elements in 3x3 block instead of 7 hourglass elements.✅ Sum only elements at positions (i,j),(i,j+1),(i,j+2),(i+1,j+1),(i+2,j),(i+2,j+1),(i+2,j+2).
Wrong: Missing max hourglass at last valid positionLoop bounds off-by-one causing last hourglass to be skipped.✅ Loop i from 0 to n-3 inclusive and j from 0 to m-3 inclusive.
Wrong: Partial scan or first max hourglass returnedGreedy approach returning first max without scanning all hourglasses.✅ Scan all hourglass positions and update max sum accordingly.
Wrong: TLE or timeoutAlgorithm complexity worse than O(n*m), e.g., nested loops beyond fixed pattern or exponential.✅ Use direct nested loops scanning all hourglass positions once; avoid exponential or unnecessary nested loops.
✓
Test Cases
t1_01basic
Input{"matrix":[[1,2,3,0,0],[0,0,0,0,0],[2,1,4,0,0],[0,0,0,0,0],[1,1,0,1,0]]}
Expected13

The hourglass with maximum sum is the one starting at (0,0): 1+2+3+0+2+1+4=13.

t1_02basic
Input{"matrix":[[1,1,1,0,0],[0,1,0,0,0],[1,1,1,0,0],[0,0,2,4,4],[0,0,0,2,0]]}
Expected10

Max hourglass sum is 10 from hourglass starting at (2,1): 1+1+0+2+0+2+4=10.

t2_01edge
Input{"matrix":[[-1,-1,-1],[-1,-1,-1],[-1,-1,-1]]}
Expected-7

Only one hourglass possible; sum all elements: 7 * -1 = -7.

t2_02edge
Input{"matrix":[[1000000,-1000000,1000000],[-1000000,1000000,-1000000],[1000000,-1000000,1000000]]}
Expected3000000

Sum of hourglass is 1000000+(-1000000)+1000000+1000000+1000000+(-1000000)+1000000=3000000.

t2_03edge
Input{"matrix":[[1,1,1],[1,1,1],[1,1,1]]}
Expected7

Only one hourglass possible; sum all 7 elements = 7.

t3_01corner
Input{"matrix":[[1,2,3,4],[0,0,0,0],[4,3,2,1],[0,0,0,0]]}
Expected15

Max hourglass sum is 15 from hourglass starting at (0,1): 2+3+4+0+3+2+1=15.

t3_02corner
Input{"matrix":[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]}
Expected7

All hourglasses have sum 7; code must return 7, not sum of all elements.

t3_03corner
Input{"matrix":[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25]]}
Expected133

Max hourglass sum is 99 from hourglass starting at (2,2): 13+14+15+19+23+24+25=99.

t4_01performance
Input{"matrix":[[1000,999,998,997,996,995,994,993,992,991,990,989,988,987,986,985,984,983,982,981,980,979,978,977,976,975,974,973,972,971,970,969,968,967,966,965,964,963,962,961,960,959,958,957,956,955,954,953,952,951,950,949,948,947,946,945,944,943,942,941,940,939,938,937,936,935,934,933,932,931,930,929,928,927,926,925,924,923,922,921,920,919,918,917,916,915,914,913,912,911,910,909,908,907,906,905,904,903,902,901],[900,899,898,897,896,895,894,893,892,891,890,889,888,887,886,885,884,883,882,881,880,879,878,877,876,875,874,873,872,871,870,869,868,867,866,865,864,863,862,861,860,859,858,857,856,855,854,853,852,851,850,849,848,847,846,845,844,843,842,841,840,839,838,837,836,835,834,833,832,831,830,829,828,827,826,825,824,823,822,821,820,819,818,817,816,815,814,813,812,811,810,809,808,807,806,805,804,803,802],[801,800,799,798,797,796,795,794,793,792,791,790,789,788,787,786,785,784,783,782,781,780,779,778,777,776,775,774,773,772,771,770,769,768,767,766,765,764,763,762,761,760,759,758,757,756,755,754,753,752,751,750,749,748,747,746,745,744,743,742,741,740,739,738,737,736,735,734,733,732,731,730,729,728,727,726,725,724,723,722,721,720,719,718,717,716,715,714,713,712,711,710,709,708,707,706,705,704,703,702],[701,700,699,698,697,696,695,694,693,692,691,690,689,688,687,686,685,684,683,682,681,680,679,678,677,676,675,674,673,672,671,670,669,668,667,666,665,664,663,662,661,660,659,658,657,656,655,654,653,652,651,650,649,648,647,646,645,644,643,642,641,640,639,638,637,636,635,634,633,632,631,630,629,628,627,626,625,624,623,622,621,620,619,618,617,616,615,614,613,612,611,610,609,608,607,606,605,604,603,602],[601,600,599,598,597,596,595,594,593,592,591,590,589,588,587,586,585,584,583,582,581,580,579,578,577,576,575,574,573,572,571,570,569,568,567,566,565,564,563,562,561,560,559,558,557,556,555,554,553,552,551,550,549,548,547,546,545,544,543,542,541,540,539,538,537,536,535,534,533,532,531,530,529,528,527,526,525,524,523,522,521,520,519,518,517,516,515,514,513,512,511,510,509,508,507,506,505,504,503,502],[501,500,499,498,497,496,495,494,493,492,491,490,489,488,487,486,485,484,483,482,481,480,479,478,477,476,475,474,473,472,471,470,469,468,467,466,465,464,463,462,461,460,459,458,457,456,455,454,453,452,451,450,449,448,447,446,445,444,443,442,441,440,439,438,437,436,435,434,433,432,431,430,429,428,427,426,425,424,423,422,421,420,419,418,417,416,415,414,413,412,411,410,409,408,407,406,405,404,403,402],[401,400,399,398,397,396,395,394,393,392,391,390,389,388,387,386,385,384,383,382,381,380,379,378,377,376,375,374,373,372,371,370,369,368,367,366,365,364,363,362,361,360,359,358,357,356,355,354,353,352,351,350,349,348,347,346,345,344,343,342,341,340,339,338,337,336,335,334,333,332,331,330,329,328,327,326,325,324,323,322,321,320,319,318,317,316,315,314,313,312,311,310,309,308,307,306,305,304,303,302],[301,300,299,298,297,296,295,294,293,292,291,290,289,288,287,286,285,284,283,282,281,280,279,278,277,276,275,274,273,272,271,270,269,268,267,266,265,264,263,262,261,260,259,258,257,256,255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240,239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224,223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208,207,206,205,204,203,202],[201,200,199,198,197,196,195,194,193,192,191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176,175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160,159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144,143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128,127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112,111,110,109,108,107,106,105,104,103,102],[101,100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2],[1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-29,-30,-31,-32,-33,-34,-35,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-57,-58,-59,-60,-61,-62,-63,-64,-65,-66,-67,-68,-69,-70,-71,-72,-73,-74,-75,-76,-77,-78,-79,-80,-81,-82,-83,-84,-85,-86,-87,-88,-89,-90,-91,-92,-93,-94,-95,-96,-97,-98]]}
⏱ Performance - must finish in 2000ms

Large 15x100 matrix (n=15, m=100) tests O(n*m) complexity; must complete within 2 seconds.

Practice

(1/5)
1. You are given a matrix of integers. You need to find all elements that are the smallest in their row and simultaneously the largest in their column. Which approach guarantees an optimal solution to this problem?
easy
A. Use a brute force approach checking each element by scanning its entire row and column repeatedly.
B. Precompute the minimum value of each row and the maximum value of each column, then find elements matching both conditions in a single pass.
C. Apply a dynamic programming approach to store intermediate minimum and maximum values for submatrices.
D. Use a greedy approach by selecting the smallest element in each row and checking if it is the largest in its column.

Solution

  1. Step 1: Understand problem constraints

    The problem requires identifying elements that are simultaneously the minimum in their row and maximum in their column.
  2. Step 2: Evaluate approaches

    Brute force (A) is correct but inefficient. DP (C) is unnecessary overhead. Greedy (D) can fail if multiple minimums exist in a row but only one is maximum in its column. Precomputing row minimums and column maximums (B) allows a single pass to find all lucky numbers efficiently.
  3. Final Answer:

    Option B -> Option B
  4. Quick Check:

    Precompute arrays then single pass -> optimal and correct [OK]
Hint: Precompute mins and maxes for single pass [OK]
Common Mistakes:
  • Assuming greedy selection per row suffices
  • Using DP unnecessarily
  • Brute force is too slow
2. Consider the following Python code for finding lucky numbers in a matrix:
from typing import List

def luckyNumbers(matrix: List[List[int]]) -> List[int]:
    m, n = len(matrix), len(matrix[0])
    row_mins = [min(row) for row in matrix]
    col_maxs = [max(matrix[i][j] for i in range(m)) for j in range(n)]
    return [matrix[i][j] for i in range(m) for j in range(n) if matrix[i][j] == row_mins[i] == col_maxs[j]]

mat = [[3,7,8],[9,11,13],[15,16,17]]
print(luckyNumbers(mat))
What is the output of this code?
easy
A. [15]
B. [3, 11, 17]
C. [8, 13, 17]
D. [7, 11, 16]

Solution

  1. Step 1: Compute row minimums

    Row 0 min = 3, Row 1 min = 9, Row 2 min = 15.
  2. Step 2: Compute column maximums

    Col 0 max = max(3,9,15) = 15, Col 1 max = max(7,11,16) = 16, Col 2 max = max(8,13,17) = 17.
  3. Step 3: Find elements equal to both row min and column max

    Check each element: - (2,0) = 15 equals row 2 min and col 0 max -> lucky number. No other elements satisfy both conditions.
  4. Final Answer:

    Option A -> Option A
  5. Quick Check:

    Only 15 matches both conditions -> output [15] [OK]
Hint: Check row mins and col maxs carefully [OK]
Common Mistakes:
  • Confusing min and max
  • Off-by-one indexing
  • Returning all row mins or col maxs
3. You are given a square matrix and asked to transform it so that rows become columns and columns become rows without using extra space. Which approach guarantees an optimal in-place solution?
easy
A. Use a brute force approach by creating a new matrix and copying elements accordingly.
B. Swap elements symmetrically across the diagonal only once, iterating over the upper triangle of the matrix.
C. Apply a greedy approach by swapping elements row-wise without considering the diagonal symmetry.
D. Use dynamic programming to store intermediate transposed states and build the final matrix.

Solution

  1. Step 1: Understand the problem constraints

    The problem requires an in-place transpose of a square matrix, meaning no extra matrix can be used.
  2. Step 2: Identify the correct approach

    Swapping elements symmetrically across the diagonal once (upper triangle only) ensures each pair is swapped exactly once, achieving in-place transpose efficiently.
  3. Final Answer:

    Option B -> Option B
  4. Quick Check:

    Swapping only upper triangle elements avoids double swaps and extra space [OK]
Hint: Swap only upper triangle elements once [OK]
Common Mistakes:
  • Using extra space unnecessarily
  • Swapping elements twice by iterating entire matrix
  • Ignoring diagonal symmetry leading to incorrect results
4. What is the time complexity of the optimal staircase search algorithm for counting negative numbers in an m x n sorted matrix, and why?
medium
A. O(m * n) because each element might be visited once.
B. O(n) because it only scans the top row and last column.
C. O(m log n) because it performs binary search on each row.
D. O(m + n) because the algorithm moves at most m times down and n times left.

Solution

  1. Step 1: Analyze movement in matrix

    The algorithm starts at top-right and moves left or down, never revisiting cells.
  2. Step 2: Count maximum moves

    Maximum moves down = m, maximum moves left = n, total moves ≤ m + n.
  3. Final Answer:

    Option D -> Option D
  4. Quick Check:

    Linear traversal along edges, not full matrix scan [OK]
Hint: Moves only left or down once per step, total ≤ m+n [OK]
Common Mistakes:
  • Confusing with brute force O(m*n)
  • Assuming binary search per row
  • Ignoring that each cell is visited once
5. Suppose the matrix is no longer sorted row-wise or column-wise but only each row is sorted independently. Which approach correctly counts negative numbers efficiently in this scenario?
hard
A. Use the staircase search from top-right corner as before.
B. Use brute force nested loops to check every element.
C. Perform binary search on each row to find the first negative number and sum counts.
D. Apply dynamic programming to store counts of negatives in submatrices.

Solution

  1. Step 1: Analyze sorting constraints

    Only rows are sorted, columns are not, so staircase search relying on column sorting fails.
  2. Step 2: Choose correct approach

    Binary search per row finds first negative efficiently in O(log n), total O(m log n), better than brute force.
  3. Final Answer:

    Option C -> Option C
  4. Quick Check:

    Row-wise binary search exploits partial sorting [OK]
Hint: When only rows sorted, binary search per row is optimal [OK]
Common Mistakes:
  • Trying staircase search without column sorting
  • Using brute force ignoring partial sorting
  • Assuming DP is needed
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard