Advertisement
vkazar

Untitled

Sep 25th, 2023
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 4.37 KB | None | 0 0
  1. //package sprint3.final.A
  2. //
  3. //import sprint3.final.A.Solution.brokenSearch
  4. //
  5. //
  6. //fun main() {
  7. //    val len = readln().toInt()
  8. //    val k = readln().toInt()
  9. //    readln().split(" ").map { it.toInt() }
  10. //        .toIntArray()
  11. //        .let { brokenSearch(it, k) }
  12. //        .let(::println)
  13. //    main()
  14. //}
  15. object Solution {
  16.     fun brokenSearch(arr: IntArray, k: Int): Int {
  17.         // Your code
  18.         // ヽ(´▽`)/
  19.         return arr.brokenSearch(k, 0, arr.lastIndex);
  20.     }
  21.     /**
  22.      * Ищет индекс в отсортированном массиве
  23.      */
  24.     fun IntArray.search(valueToSearch: Int, left: Int, right: Int): Int {
  25.         val mid = (right + left) / 2
  26.         //Базовый случай: период поиска сужен до 1 элемента
  27.         if (left == right) {
  28.             //если он -- искомый, то возвращаем индекс
  29.             if (this[left] == valueToSearch) return left
  30.             //иначе возвращаем -1, т.к. элемент не найден
  31.             return -1
  32.         }
  33.         //Если промежуток отрицательный
  34.         if (left > right) return -1
  35.         //Если посередине искомый -- возвращаем его индекс
  36.         if (this[mid] == valueToSearch) return mid
  37.         //Если искомый слева, то рекурсивно вызываем поиск слева, исключив средний (он проверен)
  38.         if (this[mid] > valueToSearch) return search(valueToSearch, left, mid - 1)
  39.         //иначе искомый справа, рекурсивно вызываем поиск справа, также исключив средний
  40.         return search(valueToSearch, mid + 1, right)
  41.     }
  42.     /**
  43.      * Ищет индекс в сломанном массиве
  44.      */
  45.     fun IntArray.brokenSearch(valueToSearch: Int, left: Int, right: Int): Int {
  46.         //Базовый случай: изначально в массиве 1 элемент
  47.         if (left == right) {
  48.             //если он -- искомый, то возвращаем индекс
  49.             if (this[left] == valueToSearch) return left
  50.             //иначе возвращаем -1, т.к. элемент не найден
  51.             return -1
  52.         }
  53.         val mid = (right + left) / 2
  54.         if (this[mid] == valueToSearch) return mid
  55.         //Середина разбивает массив на два подмассива, как минимум один из которых заведомо отсортирован
  56.         //Если у левого отрезка сохранена сортировка концов, то он в целом отсортирован
  57.         if (this[left] <= this[mid]) {
  58.             //левый отсортирован
  59.             if (valueToSearch in this[left] until this[mid]) {
  60.                 //искомый находится в левом отсортированном подмассиве
  61.                 return search(valueToSearch, left, mid - 1)
  62.             } else {
  63.                 //искомый находится в правом подмассиве
  64.                 //середина могла разбить на два отсортированных массива, проверяем правый
  65.                 if (this[mid] <= this[right]) {
  66.                     //правый отсортирован
  67.                     return search(valueToSearch, mid + 1, right)
  68.                 } else {
  69.                     //правый не отсортирован
  70.                     return brokenSearch(valueToSearch, mid + 1, right)
  71.                 }
  72.             }
  73.         } else {
  74.             //левый подмассив не отсортирован
  75.             //значит правый точно отсортирован
  76.             if (valueToSearch in this[mid + 1]..this[right]) {
  77.                 //искомый находится в правом отсортированном подмассиве
  78.                 return search(valueToSearch, mid + 1, right)
  79.             } else {
  80.                 //искомый находится в левом неотсортированном подмассиве
  81.                 return brokenSearch(valueToSearch, left, mid - 1)
  82.             }
  83.         }
  84.     }
  85. }
  86.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement