[Алгоритм] Хитрости и хитрости с двойными указателями (1): Столкновение указателей

1. Указатель столкновения

        Указатель столкновения состоит из двух указателей, указывающих на начало и конец данных соответственно :

        Два указателя перемещаются с обоих концов соответственно и останавливаются после нахождения положения, соответствующего ответу . Сталкивающиеся указатели в основном используются при суммировании упорядоченных массивов Мы используем тему для иллюстрации:

         Примеры следующие:

         В зависимости от темы можно вывести следующие условия:

  • Массивы расположены в порядке возрастания .
  • Невозможно повторить один и тот же элемент (то есть index1=index2 нецелесообразно), но существует отношение 1<index1<index2<=numbers.Length .
  • Только соответствует единственному ответу, то есть ответов может быть больше одного, нужно вывести только один из них

        Существует множество решений, использующих два для обхода, бинарного поиска, динамического программирования и т. д. Мы используем Пример 1 для объяснения указателей коллизий:

         Инициализируйте два указателя головы и хвоста, указывающих на начальную и хвостовую части массива соответственно:

         Определяем, соответствует ли сложение текущих значений целевому числу, 2 + 15 = 17 > 9, и хвостовой указатель перемещается влево :

        Посчитаем еще раз: 2 + 11 = 13 > 9, продолжаем двигать хвостовой указатель влево:

        2 + 7 = 9 == 9, выведите результат. Увидев это , предполагается, что многие люди будут сбиты с толку.Почему таким образом можно получить правильный результат ? Давайте используем пример для анализа и иллюстрации:

         Перечислим все возможные результаты сложения:

         По второму условию сначала исключаем случай, когда index1 = index 2 :

         Черная часть - это исключенная часть:

        Затем удалите часть index1 > index2 :

 

        Сумма значений, на которые указывают текущие указатели головы и хвоста, равна 17, отмеченным оранжевым цветом :

 

        2+15 = 17 < 22, что указывает на то, что сумма двух чисел должна расти дальше, а число, на которое указывает хвостовой указатель, уже является наибольшим, поэтому необходимо переместить головной указатель вправо, чтобы сумма Затем делается вывод, что цифра 2, указанная указателем в начале, не совпадает с цифрой 6, 10, 12, 15, указанной указателем в хвосте, потому что 15 уже является наибольшим числом, которое не соответствует целевому числу, другие числа меньше его Не говоря уже о том , что текущий указатель головы перемещается вправо:

         Текущая ситуация выглядит следующим образом:

         Тогда давайте сделаем вывод, 6 + 15 = 21 < 22, что указывает на то, что сумма двух чисел недостаточно велика, продолжайте увеличивать, и указатель головы переместится вправо:

        Исключите один элемент снова, как указано выше:

        10 + 15 = 25 > 22, если вы понимаете принцип, упомянутый выше, здесь также очень просто понять, то есть сумма двух чисел больше целевого числа, поэтому сумма двух чисел необходимо уменьшить, потому что число, указанное головным указателем, уже является наименьшим , поэтому вам нужно переместить хвостовой указатель влево, чтобы уменьшить сумму двух чисел:

         Исключить один элемент из Y:

        Последнее оставшееся число — это правильный ответ, из которого мы можем вывести условия оценки для указателя столкновения :

  • Сумма двух чисел больше целевого числа, и хвостовой указатель перемещается влево.
  • Сумма двух чисел меньше целевого числа, и указатель головы перемещается вправо.
  • Сумма двух чисел равна целевому числу, выведите результат

        Код реализации коллизии выглядит следующим образом (ссылка):

        В следующей главе будут представлены быстрые и медленные указатели, которые используются для быстрого получения промежуточных чисел.

Supongo que te gusta

Origin blog.csdn.net/qq_41884002/article/details/128289581
Recomendado
Clasificación