我正在编写一个应用程序,并正在使方法getMaxHeight
将n和一个数组作为输入,然后尝试找出最大高度。
正在计算立方体的高度,如果它们可以堆叠在一起并且没有底面。
I.E。 https://pasteboard.co/HWyCD4m.png
我当前的代码是这个
static int getMaxHeight(int n, Box[] arr)
{
Box []boxes = new Box[n];
for(int i = 0;i<n;i++)
{
Box curr = arr[i];
boxes[i] = new Box(curr.height);
}
int maxHeight = 0;
for (int i = 0; i < arr.length; i++) {
if(i == 0) {
maxHeight = arr[i].height;
}
else if (maxHeight < arr[i].height && arr[i].height > arr[i-1].height) {
maxHeight = arr[i].height;
}
else if(maxHeight >= arr[i].height && arr[i].height > arr[i-1].height) {
maxHeight = maxHeight;
}
else if(maxHeight > arr[i].height && arr[i].height < arr[i-1].height) {
maxHeight = maxHeight + arr[i].height;
}
}return maxHeight;
}
第一个if将起始框设置为最大高度。
第二个if检查maxHeight是否小于框的高度(如果是)并且框的高度也大于框,然后它才是新的maxHeight(上图中的第3个选项)
第三个if检查框是否都小于最大高度并且是否大于前一个框(图像中的第二个选项)
第三个检查是否同时小于最大高度和小于前一个框 (图片中的第一个选项)
如何使它更快?这似乎太慢了
答案 0 :(得分:0)
您可以使用Math.max使用以下循环(并将max初始化为Double.NEGATIVE_INFINITY
double max = Double.NEGATIVE_INFINITY;
double previous = Double.NEGATIVE_INFINITY;
for(int i=0; i<array.length; i++)
{
double current = array[i];
if(current < previous) {
max = max + current; // putting on top
}
else {
max = Math.max(max, current); // max
}
previous = current;
}
如果愿意,可以在一行中执行if-else
max = current < previous ? max + current : Math.max(max,current);
或
max = Math.max(max,current) + (current < previous ? current : 0);
答案 1 :(得分:0)
这似乎是您要尝试执行的操作:
static int getMaxHeight(int n, Box[] arr) {
int maxHeight = arr[0].height; // set max to be the first box
Box previous = arr[0];
for (int i = 1; i < arr.length; i++) {
int curHeight = arr[i].height;
if (curHeight > Math.max(previous.height, maxHeight)) {
maxHeight = curHeight;
}
else if (curHeight < Math.min(previous.height, maxHeight)) {
maxHeight = maxHeight + curHeight;
}
previous = arr[i];
}
return maxHeight;
}
我删除了if
条语句中的一条,因为语句maxHeight = maxHeight;
没有实际意义。
让我知道这是否有效。