Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //package sprint3.final.A
- //
- //import sprint3.final.A.Solution.brokenSearch
- //
- //
- //fun main() {
- // val len = readln().toInt()
- // val k = readln().toInt()
- // readln().split(" ").map { it.toInt() }
- // .toIntArray()
- // .let { brokenSearch(it, k) }
- // .let(::println)
- // main()
- //}
- object Solution {
- fun brokenSearch(arr: IntArray, k: Int): Int {
- // Your code
- // ヽ(´▽`)/
- return arr.brokenSearch(k, 0, arr.lastIndex);
- }
- /**
- * Ищет индекс в отсортированном массиве
- */
- fun IntArray.search(valueToSearch: Int, left: Int, right: Int): Int {
- val mid = (right + left) / 2
- //Базовый случай: период поиска сужен до 1 элемента
- if (left == right) {
- //если он -- искомый, то возвращаем индекс
- if (this[left] == valueToSearch) return left
- //иначе возвращаем -1, т.к. элемент не найден
- return -1
- }
- //Если промежуток отрицательный
- if (left > right) return -1
- //Если посередине искомый -- возвращаем его индекс
- if (this[mid] == valueToSearch) return mid
- //Если искомый слева, то рекурсивно вызываем поиск слева, исключив средний (он проверен)
- if (this[mid] > valueToSearch) return search(valueToSearch, left, mid - 1)
- //иначе искомый справа, рекурсивно вызываем поиск справа, также исключив средний
- return search(valueToSearch, mid + 1, right)
- }
- /**
- * Ищет индекс в сломанном массиве
- */
- fun IntArray.brokenSearch(valueToSearch: Int, left: Int, right: Int): Int {
- //Базовый случай: изначально в массиве 1 элемент
- if (left == right) {
- //если он -- искомый, то возвращаем индекс
- if (this[left] == valueToSearch) return left
- //иначе возвращаем -1, т.к. элемент не найден
- return -1
- }
- val mid = (right + left) / 2
- if (this[mid] == valueToSearch) return mid
- //Середина разбивает массив на два подмассива, как минимум один из которых заведомо отсортирован
- //Если у левого отрезка сохранена сортировка концов, то он в целом отсортирован
- if (this[left] <= this[mid]) {
- //левый отсортирован
- if (valueToSearch in this[left] until this[mid]) {
- //искомый находится в левом отсортированном подмассиве
- return search(valueToSearch, left, mid - 1)
- } else {
- //искомый находится в правом подмассиве
- //середина могла разбить на два отсортированных массива, проверяем правый
- if (this[mid] <= this[right]) {
- //правый отсортирован
- return search(valueToSearch, mid + 1, right)
- } else {
- //правый не отсортирован
- return brokenSearch(valueToSearch, mid + 1, right)
- }
- }
- } else {
- //левый подмассив не отсортирован
- //значит правый точно отсортирован
- if (valueToSearch in this[mid + 1]..this[right]) {
- //искомый находится в правом отсортированном подмассиве
- return search(valueToSearch, mid + 1, right)
- } else {
- //искомый находится в левом неотсортированном подмассиве
- return brokenSearch(valueToSearch, left, mid - 1)
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement