与“循环”中的先前元素相比,“阵列中的循环”

时间:2019-01-15 11:42:51

标签: java

我正在编写一个应用程序,并正在使方法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检查框是否都小于最大高度并且是否大于前一个框(图像中的第二个选项)

第三个检查是否同时小于最大高度和小于前一个框 (图片中的第一个选项)

如何使它更快?这似乎太慢了

2 个答案:

答案 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;没有实际意义。 让我知道这是否有效。