Как посчитать высшую левую и правую высоту? - PullRequest
0 голосов
/ 13 апреля 2019

Мне нужно написать метод, который подсчитывает верхнюю левую и правую высоту текущего индекса.Допустим, у нас есть массив {1,4,7,3,2}, поэтому для индекса 1 (высота 4) - maxLeftHeight=1, maxRightHeight=7 и для индекса 2 (высота 7) - maxLeftHeight=4, maxRightHeight=3 и так далее ...

Первый и последний индексы не учитываются, поэтому массив начинает считать с 1 и заканчивает считать с array.length-1

Я пытался написать код дляэто и вот что я получил:

public String getCurrentMaxHeights(int[] height)
{
  int maxLeft = 0;
  int maxRight = 0;
  String st = "";
  for (int i = 1; i < height.length - 1; i++)
  {

    maxRight = Math.max(height[i + 1], height[height.length - 1]);
    maxLeft = Math.max(height[i - 1], height[0]);
    st += "The max left height for " + height[i] + " is " + maxLeft +
      " the max right height is " + maxRight + " \n";

  }
  return st;
}

вывод:

Максимальная левая высота для 1 равна 2, максимальная правая высота равна 3 Максимальная левая высота для1 равно 2, максимальная правая высота равна 4, максимальная левая высота для 4 равна 2, максимальная правая высота равна 3, максимальная левая высота для 1 равна 4, максимальная правая высота равна 3, максимальная левая высота для 1 равна 2, максимальная правая высота равна3 Максимальная левая высота для 2 равна 2, максимальная правая высота составляет 3

Это неправильно, как я могу исправить это, чтобы быть правым?

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Вам нужно использовать 2 nested for-loops:

  • Один для получения maxLeft.
  • Один для получения maxRight.

Где i - текущий индекс, от 0 до i - 1, вычисление maxLeft и от i + 1 до n - 1, вычисление maxRight.

public String getCurrentMaxHeights(int[] height)
{
   int maxLeft;
   int maxRight;
   String st = "";
   for (int i = 1; i < height.length - 1; i++)
   {
        // Initialize to first element.
        maxLeft = height[0]
        // Update if any are greater.
        for (int j = 1; j < i; j++)
            maxLeft = Math.max(maxLeft, height[j])
        // Initialize to element following i.
        maxRight = height[i + 1]
        // Update if any are greater.
        for (int j = i + 2; j < height.length; j++)
            maxRight = Math.max(maxRight, height[j])

        st += "The max left height for " + height[i] + " is " + maxLeft +
    " the max right height is " + maxRight + " \n";
   }
return st;
}
0 голосов
/ 13 апреля 2019

Попробуйте selectedIndex - это index, с которого вы начинаете. Кроме того, добавьте проверку, есть ли значения в left или right или нет

  Integer[] leftValues = Arrays.copyOfRange(numArray, 0, selectedIndex);
  Integer[] rightValues = Arrays.copyOfRange(numArray, selectedIndex+1,numArray.length);
  List<Integer> leftList = Arrays.asList(leftValues);
  List<Integer> rightList = Arrays.asList(rightValues);
  int leftMax = 
  leftList.stream().collect(Collectors.summarizingInt(Integer::intValue)).getMax();
  int rightMax= 
  rightList.stream().collect(Collectors.summarizingInt(Integer::intValue)).getMax();

Другой способ с полным примером, если вы хотите с int array, а не Integer:

  int[] spam = new int[] { 1, 2, 3,5,4,7,1,2,9,12 };
  int[] leftValues = Arrays.copyOfRange(spam, 0, 7);
  int[] rightValues = Arrays.copyOfRange(spam, 7+1,spam.length );
  List<Integer> leftList = Arrays.stream(leftValues).boxed().collect(Collectors.toList());
  List<Integer> rightList = Arrays.stream(rightValues).boxed().collect(Collectors.toList());
  int leftMax = leftList.stream().collect(Collectors.summarizingInt(Integer::intValue)).getMax();
  int rightMax= 
         rightList.stream().collect(Collectors.summarizingInt(Integer::intValue)).getMax();
...