Я пытаюсь ответить на следующий вопрос: учитывая отсортированный массив с некоторыми упорядоченными числами и некоторыми непересекающимися числами, напишите алгоритм, который получает пару {start, end} для каждой группы последовательных номера. У последовательных номеров есть разница только 1.Массив с последовательными номерами - Алгоритм
До сих пор я могу думать только грубой силы метод:
public static void main(String[] args) {
int[] array = { 4, 5, 6, 7, 8, 9, 12, 15, 16, 17, 18, 20, 22, 23, 24, 27 };
Map<Integer, Integer> list = new HashMap<Integer, Integer>();
list = findIndex(array);
}
// Bruteforce
private static Map<Integer, Integer> findIndex(int[] array) {
Map<Integer, Integer> list = new HashMap<Integer, Integer>();
int x = -1, y = -1;
int end = array.length;
for (int i = 0; i < end; i++) {
x = i;
while (i < end - 1) {
if (array[i] + 1 == array[i + 1]) {
i++;
y = i;
} else {
if (x != y && x >= 0) {
list.put(x, y);
System.out.println("i = " + x + " to j = " + y);
i = i + 1;
break;
}
}
}
}
return list;
}
Выход:
i = 0 to j = 5
i = 7 to j = 10
i = 12 to j = 14
Он отлично работает, но как я могу улучшить временную сложность?
проблема с вашим кодом - это не столько алгоритмическая сложность, сколько ясность. Этот код на самом деле повторяет только один раз через массив, хотя вложенный цикл скрывает это. O (n) - лучшее, что вы можете сделать. –
@AndrewPalmer Cant мы используем двоичный поиск здесь? – Sarah
Я должен сказать, что это действительно интересная мысль. Это определенно не будет стандартным приложением двоичного поиска, но в зависимости от того, что гарантировано в отношении массива, вы можете определить, есть ли 8 пробелов и начать сужаться там, где есть пробелы. –