Advertisement
vit134

Количество переворотов массива (Яндекс)

Nov 9th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.     Найти количество поворотов массива
  3.     Есть функция поворта массива которая переносит последний элемент в начало массива
  4.     function rotate_array(arr) {
  5.       arr.unshift(arr.pop());
  6.       return arr;
  7.     }
  8.     Затем эту функцию несколько раз (меньшее чем длинна массива) применили к некоторому массиву, длинной больше двух,     содержащему неповторяющиеся числа в порядке неубывания  [1, 3, 5, 7, 43, 76] .
  9.     Получили что-то вроде  [43, 76, 1, 3, 5, 7]
  10.     Требуется написать функцию которая определит сколько раз применили функцию  rotate_array .
  11. */
  12.  
  13. // O(n)
  14. function calc_rotations(arr) {
  15.   for (let i = 0; i < arr.length - 1; i++) {
  16.     if (arr[i] > arr[i + 1]) {
  17.       return i + 1;
  18.     }
  19.   }
  20.   return 0;
  21. }
  22.  
  23. // O(log(n))
  24. function calc_rotations(arr) {
  25.   function check_item(i) {
  26.     return i >= 0 && i <arr.length && arr[i] > arr[i + 1];
  27.   }
  28.  
  29.   let start = 0;
  30.   let end = arr.length - 1;
  31.   while(end - start > 1) {
  32.     let mid = start + Math.floor((end - start) / 2);
  33.     if (check_item(mid)) {
  34.       return mid + 1;
  35.     } else if (arr[start] < arr[mid]) {
  36.       start = mid;
  37.     } else {
  38.       end = mid;
  39.     }
  40.   }
  41.  
  42.   if (check_item(start)) {
  43.     return start + 1;
  44.   }
  45.   if (check_item(end)) {
  46.     return end + 1;
  47.   }
  48.   return 0;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement