Advertisement
alexanderik

VolumeCalculator

Oct 31st, 2013
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.74 KB | None | 0 0
  1. //Решение работает в один проход, избегая поиска максимума проходом двух «указателей» навстречу друг другу
  2. //с противоположных концов массива. Если наибольшее значение, найденное слева от левого указателя меньше,
  3. //чем наибольшее значение найденное справа от правого указателя, то мы сдвигаем левый указатель на один индекс вправо.
  4. //В противном случае, двигаем правый указатель на один индекс влево. Повторяем до тех пор, пока два указателя не пересекутся.
  5. //(На словах звучит запутанно, код на самом деле очень простой)
  6.  
  7.  
  8.  
  9. class Ideone
  10. {
  11.     public static void main (String[] args) //throws java.lang.Exception
  12.     {
  13.         int[] myIntArray = {1, 2, 1, 4, 2, 3, 2, 3, 2, 4};
  14.         int[] myIntArray2= {1, 3, 2, 5, 1, 3, 1, 4};
  15.        
  16.         System.out.println(calculateVolume(myIntArray));
  17.         System.out.println(calculateVolume(myIntArray2));
  18.     }
  19.    
  20.     public static int calculateVolume(int[] land) {
  21.        
  22.         int leftMax = 0;
  23.         int rightMax = 0;
  24.         int left = 0;
  25.         int right = land.length - 1;
  26.         int volume = 0;
  27.        
  28.         while(left < right) {
  29.             if(land[left] > leftMax) {
  30.                 leftMax = land[left];
  31.             }
  32.             if(land[right] > rightMax) {
  33.                 rightMax = land[right];
  34.             }
  35.             if(leftMax >= rightMax) {
  36.                 volume += rightMax - land[right];
  37.                 right--;
  38.             } else {
  39.                 volume += leftMax - land[left];
  40.                 left++;
  41.             }
  42.         }
  43.         return volume;
  44.     }
  45. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement