题目描述
给你两个整数 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
解释:
上图显示了唯一可能的排列方式。
提示:
解法
方法一:模拟
我们可以枚举第一行的颜色,然后模拟构造三角形,计算最大高度。
时间复杂度 $O(\sqrt{n})$,其中 $n$ 为红色球和蓝色球的数量。空间复杂度 $O(1)$。
1
2
3
4
5
6
7
8
9
10
11
12 | class Solution:
def maxHeightOfTriangle(self, red: int, blue: int) -> int:
ans = 0
for k in range(2):
c = [red, blue]
i, j = 1, k
while i <= c[j]:
c[j] -= i
j ^= 1
ans = max(ans, i)
i += 1
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13 | class Solution {
public int maxHeightOfTriangle(int red, int blue) {
int ans = 0;
for (int k = 0; k < 2; ++k) {
int[] c = {red, blue};
for (int i = 1, j = k; i <= c[j]; j ^= 1, ++i) {
c[j] -= i;
ans = Math.max(ans, i);
}
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | class Solution {
public:
int maxHeightOfTriangle(int red, int blue) {
int ans = 0;
for (int k = 0; k < 2; ++k) {
int c[2] = {red, blue};
for (int i = 1, j = k; i <= c[j]; j ^= 1, ++i) {
c[j] -= i;
ans = max(ans, i);
}
}
return ans;
}
};
|
| func maxHeightOfTriangle(red int, blue int) (ans int) {
for k := 0; k < 2; k++ {
c := [2]int{red, blue}
for i, j := 1, k; i <= c[j]; i, j = i+1, j^1 {
c[j] -= i
ans = max(ans, i)
}
}
return
}
|
| function maxHeightOfTriangle(red: number, blue: number): number {
let ans = 0;
for (let k = 0; k < 2; ++k) {
const c: [number, number] = [red, blue];
for (let i = 1, j = k; i <= c[j]; ++i, j ^= 1) {
c[j] -= i;
ans = Math.max(ans, i);
}
}
return ans;
}
|