2014-10-26 3 views
-1

Я нашел эту проблему на leetcode, я решил ее на своей платформе. Для тестов я использовал 1000 элементов массивов и никогда не получал ошибку. На платформе leetcode он выдает ArrayIndexOutOfBoundsException. Если вы внимательно посмотрите, то элементы a, b или n не могут идти дальше длины массива. Это описание проблемы:Минимум в повернутом сортированном массиве ArrayIndexOutOfBoundsException

Предположим, что отсортированный массив повернут с некоторой неизвестной вам опорой. (т. Е. 0 1 2 4 5 6 7 может стать 4 5 6 7 0 1 2). Найти минимальный элемент. Вы можете предположить, что в массиве не существует дубликата.

public class Solution 
{ 
    public int findMin(int[] num) 
    { 
     int a = 0; 
     int b = num.length - 1; 
     int n = (a + b)/2; 

     while (true) 
     { 
      if (num[n] < num[n+1] && num[n] < num[n-1]) 
       break; 

      if (num[a] < num[b]) 
      { 
       b = n; 
       n = (a + n)/2 + 1; 
      } 
      else 
      { 
       a = n; 
       n = (b + n)/2; 
      } 
     } 
     return num[n];   
    } 
} 

ответ

0
public static int findMin(int[] num) { 
    return helper(num, 0, num.length - 1); 
} 

public static int helper(int[] num, int endLeft, int endRight) { 
    if (endLeft == endRight) 
     return num[endLeft]; 
    if ((endRight - endLeft) == 1) 
     return Math.min(num[endLeft], num[endRight]); 

    int middleIndex = endLeft + (endRight - endLeft)/2; 
    int middle = num[middleIndex]; // middle value 

    if (num[endLeft] < num[endRight]) { 
     return num[endLeft]; 
    } else if (middle > num[endLeft]) { 
     // go right side 
     return helper(num, middleIndex, endRight); 
    } else { 
     // go left side 
     return helper(num, endLeft, middleIndex); 
    } 
} 

От coding interview.

Смежные вопросы