数学类的算法题
1. 三角形的最大高度
给你两个整数 red
和 blue
,分别表示红色球和蓝色球的数量。你需要使用这些球来组成一个三角形,满足第 1 行有 1 个球,第 2 行有 2 个球,第 3 行有 3 个球,依此类推。
每一行的球必须是 相同 颜色,且相邻行的颜色必须 不同。
返回可以实现的三角形的 最大 高度。
参考题解:
class Solution {
public int maxHeightOfTriangle(int red, int blue) {
return compute(red,blue);
}
private int compute(int red,int blue){
// 红球第一开始
int A = (int) Math.sqrt(red);
int B = (int) (Math.sqrt(4*blue+1)-1)/2;
// 黑球第一开始
int C = (int) Math.sqrt(blue);
int D = (int) (Math.sqrt(4*red+1)-1)/2;
// 比较两种情况最高的层数
return Math.max(A > B ? 2*B+1 : 2*A,C > D ? 2*D+1 : 2*C);
}
}
作者:一行代码想一天
链接:https://leetcode.cn/problems/maximum-height-of-a-triangle/solutions/2951086/shu-xue-deng-chai-shu-lie-xing-zhi-shi-j-0oid/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
交叉相减的方法
class Solution {
public:
int maxHeightOfTriangle(int red, int blue) {
/*
两个整数,形成一个三角形
可以进行尝试:分别把红,蓝作为第一个
Case1: 假设用蓝色作为第一行元素
然后循环 blue - 1; red - 2; blue - 3; red - 4; 如果有一次操作之后小于0了,就说明得到了相应的层次,
Case2: 用红色球作为第一行元素
进行同样的操作,将最后得到的两个结果进行比较
也可以使用等差数列的计算思想
*/
// 蓝色作为第一层
// int count1 = maxHeight(blue,red);
// int count2 = maxHeight(red, blue);
// return max(count1, count2);
// 重构
return max(maxHeight(blue,red), maxHeight(red, blue));
}
private:
// 第一个参数为第一行元素颜色,第二个参数为第二行元素
int maxHeight(int firstColor, int secondColor) {
int count1 = 0;
if(firstColor > 0) {
count1 ++;
while(true) {
if(firstColor - count1 >= 0) {
firstColor -= count1;
count1 ++;
}else {
break;
}
if(secondColor - count1 >= 0) {
secondColor -= count1;
count1++;
}else {
break;
}
}
}
return count1 - 1;
}
};
原文地址:https://blog.csdn.net/m0_47411815/article/details/142938797
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!