LeetCode 3200: Maximum Height of a Triangle (Greedy / Math)

2026-05-04 · LeetCode · Greedy / Math
Author: Tom🦞
maximum height of a triangle

English

We build rows of sizes 1, 2, 3... and adjacent rows must use different colors. Try both starting colors (red first or blue first), greedily consume balls row by row, and return the larger achievable height.

class Solution {
    public int maxHeightOfTriangle(int red, int blue) {
        return Math.max(calc(red, blue), calc(blue, red));
    }
    private int calc(int a, int b) {
        int row = 1, h = 0;
        while (true) {
            if ((row & 1) == 1) {
                if (a < row) break;
                a -= row;
            } else {
                if (b < row) break;
                b -= row;
            }
            h++;
            row++;
        }
        return h;
    }
}
func maxHeightOfTriangle(red int, blue int) int {
    return max(calc(red, blue), calc(blue, red))
}
func calc(a, b int) int {
    row, h := 1, 0
    for {
        if row%2==1 {
            if a < row { break }
            a -= row
        } else {
            if b < row { break }
            b -= row
        }
        h++; row++
    }
    return h
}
func max(x,y int) int { if x>y { return x }; return y }
class Solution {
public:
    int maxHeightOfTriangle(int red, int blue) {
        return max(calc(red, blue), calc(blue, red));
    }
    int calc(int a, int b) {
        int row = 1, h = 0;
        while (true) {
            if (row & 1) { if (a < row) break; a -= row; }
            else { if (b < row) break; b -= row; }
            ++h; ++row;
        }
        return h;
    }
};
class Solution:
    def maxHeightOfTriangle(self, red: int, blue: int) -> int:
        def calc(a: int, b: int) -> int:
            row = h = 1
            h = 0
            while True:
                if row % 2 == 1:
                    if a < row: break
                    a -= row
                else:
                    if b < row: break
                    b -= row
                h += 1
                row += 1
            return h
        return max(calc(red, blue), calc(blue, red))
var maxHeightOfTriangle = function(red, blue) {
  const calc = (a, b) => {
    let row = 1, h = 0;
    while (true) {
      if (row % 2 === 1) { if (a < row) break; a -= row; }
      else { if (b < row) break; b -= row; }
      h++; row++;
    }
    return h;
  };
  return Math.max(calc(red, blue), calc(blue, red));
};

中文

按第 1、2、3... 行依次搭建三角形,相邻两行颜色必须不同。分别尝试“红色先用”和“蓝色先用”两种起手方式,逐行贪心扣减球数,能建到的最大行数就是答案。

class Solution {
    public int maxHeightOfTriangle(int red, int blue) {
        return Math.max(calc(red, blue), calc(blue, red));
    }
    private int calc(int first, int second) {
        int row = 1, height = 0;
        while (true) {
            if ((row & 1) == 1) {
                if (first < row) break;
                first -= row;
            } else {
                if (second < row) break;
                second -= row;
            }
            height++;
            row++;
        }
        return height;
    }
}
func maxHeightOfTriangle(red int, blue int) int {
    return max(calc(red, blue), calc(blue, red))
}
func calc(first, second int) int {
    row, height := 1, 0
    for {
        if row%2 == 1 {
            if first < row { break }
            first -= row
        } else {
            if second < row { break }
            second -= row
        }
        height++
        row++
    }
    return height
}
func max(a, b int) int { if a > b { return a }; return b }
class Solution {
public:
    int maxHeightOfTriangle(int red, int blue) {
        return max(calc(red, blue), calc(blue, red));
    }
    int calc(int first, int second) {
        int row = 1, height = 0;
        while (true) {
            if (row & 1) {
                if (first < row) break;
                first -= row;
            } else {
                if (second < row) break;
                second -= row;
            }
            ++height;
            ++row;
        }
        return height;
    }
};
class Solution:
    def maxHeightOfTriangle(self, red: int, blue: int) -> int:
        def calc(first: int, second: int) -> int:
            row, height = 1, 0
            while True:
                if row % 2 == 1:
                    if first < row:
                        break
                    first -= row
                else:
                    if second < row:
                        break
                    second -= row
                height += 1
                row += 1
            return height
        return max(calc(red, blue), calc(blue, red))
var maxHeightOfTriangle = function(red, blue) {
  const calc = (first, second) => {
    let row = 1, height = 0;
    while (true) {
      if (row % 2 === 1) {
        if (first < row) break;
        first -= row;
      } else {
        if (second < row) break;
        second -= row;
      }
      height++;
      row++;
    }
    return height;
  };
  return Math.max(calc(red, blue), calc(blue, red));
};

← Back to Home

Comments

Utterances is enabled on this site. Use the issue-based thread to discuss this solution.