for loop
и while loop
не имеют ничего общего с этими решениями.Фактически, мы можем изменить второе решение, чтобы сделать цикл while
как цикл for
, как показано ниже:
public int solution(int[] A) {
Arrays.sort(A);
int k, count = 0;
for (int i = 0; i < A.length - 2; i++) {
k = i + 2;
for (int j = i + 1; j < A.length; j++) {
for( ; k < A.length; k++) {
if ( (A[i] + A[j]) <= A[k]) break;
}
count += k - j - 1;
}
}
return count;
}
На самом деле, основная логика двух ваших решений совершенно различна.
В первом решении:
Мы фиксируем все возможные тройки, используя три цикла for, и разрывая третий цикл, как только сумма первых двух наименьших пар длины будет меньше или равнаэто третьего, то есть это должно быть "if (A[i] + A[j] <= A[k]) break;"
.Таким образом, общая сложность времени будет O(n^3)
.
Во втором решении:
Мы только фиксируем два for loops
и выполняем вычисления.Цикл while в вашем коде запускается только один раз для каждого for loop
с использованием i
.Так как массив был отсортирован один раз, идея этого решения состоит в том, что если мы объединяем два значения, используя первые два for loops
, а сумма значений в индексах i
и j
равна sum
, то есть sum = A[i] + A[j]
, и еслион встречает значение по индексу k
, которое больше или равно sum
, чем для следующей пары i
и j + 1
, третий индекс будет определенно больше, чем предыдущий k
, поскольку значение по индексу j + 1
больше значения в индексе j
, то есть A[j] <= A[j + 1]
.Таким образом, третий индекс должен быть точно в правой части, чем предыдущий k
.Таким образом, общая сложность второго решения составляет O(n^2)
.