题目:
给你两个整数 red 和 blue,分别表示红色球和蓝色球的数量。你需要使用这些球来组成一个三角形,满足第 1 行有 1 个球,第 2 行有 2 个球,第 3 行有 3 个球,依此类推。
每一行的球必须是 相同 颜色,且相邻行的颜色必须 不同。
返回可以实现的三角形的 最大 高度。
示例 1:
输入: red = 2, blue = 4
输出: 3
解释:

上图显示了唯一可能的排列方式。
示例 2:
输入: red = 2, blue = 1
输出: 2
解释:
上图显示了唯一可能的排列方式。
示例 3:
输入: red = 1, blue = 1
输出: 1
示例 4:
输入: red = 10, blue = 1
输出: 2
解释:
上图显示了唯一可能的排列方式。
提示:
1 <= red, blue <= 100
思路:
	我们只需要模拟就行了,一层层的加,直到不满足了,就返回上一个高度就行了,什么情况下不满足呢,那就是目前积累的最多的颜色的球数目大于最大的,或者积累的少的球数目大于第二大的,我们就返回上一层就好了。
代码:
class Solution {
public:
    // 函数用于计算给定红色和蓝色单位时,可以构建的最大高度的三角形
    int maxHeightOfTriangle(int red, int blue) {
        // 获取较大和较小的单位数
        int maxV = max(red, blue); // maxV 用于存储较大的单位数
        int minV = min(red, blue); // minV 用于存储较小的单位数
        int h = 1;   // 初始化高度 h,从 1 开始
        int first = 0;   // first 用于记录奇数层的总单位数
        int second = 0;  // second 用于记录偶数层的总单位数
        // 开始循环,每次增加一层高度
        while(true) {
            if(h % 2 == 1) {
                // 如果当前层为奇数层,增加到 first
                first += h;
            } else {
                // 如果当前层为偶数层,增加到 second
                second += h;
            }
            // 如果当前任何一个累积数超过了可用的最大或最小单位数,结束
            if(max(first, second) > maxV || min(first, second) > minV) {
                return h - 1;  // 返回前一层的高度,因为当前层无法完成
            }
            h++;  // 继续增加高度
        }
        // 理论上不会到达此处,但为了保险起见,返回 1
        return 1;
    }
};