повернуть матрицу по часовой стрелке на 45 градусов. Вы получите набор данных в форме ромба. Высота будет 2N-1, количество элементов в каждом ряду сверху будет примерно таким: 1,2,3,4,5,4,3,2,1 для N = 5
узнайте, что каждое число в строке всегда больше любого числа выше.
для k-й строки (считая от 1) у вас будет k элементов для k < N и, 2N-k для k> = N k принадлежит {1..2N-1}
Вычисляя накопленное количество элементов от строки 1 до k-1 и от 1 до k, вы найдете строка, в которой находится ваша цель (сумма (от 1 до k-1)
Теперь, когда вы нашли ряд элементов с наихудшим случаем N всего. Вы можете отсортировать их и затем найти правильный. this taks O ( N ln N)
, поскольку N = sqrt (n), общая стоимость этого алгоритма составляет O (sqrt (n) ln (sqrt (n)))
Этот вопрос так часто обсуждался в списках рассылки Ruby и блогах Ruby, что теперь в списке рассылки Ruby есть даже цепочки, единственной целью которых является сбор ссылок на все другие цепочки на список рассылки Ruby, в котором обсуждается эта проблема.
Вот один: Полный список || = (OR Equal) потоков и страниц
Если вы действительно хотите знать, что происходит, взгляните на Раздел 11.4. 2.3 «Сокращенные присвоения» проекта спецификации языка Ruby .
В первом приближении
a ||= b
эквивалентно
a || a = b
, а не эквивалентно
a = a || b
Однако это только первое приближение, особенно если a
не определено . Семантика также различается в зависимости от того, простое ли это присвоение переменной, присвоение метода или присвоение индексации: все
a ||= b
a.c ||= b
a[c] ||= b
обрабатываются по-разному.
Означает или равно. Он проверяет, определено ли значение слева, а затем использует его. Если это не так, используйте значение справа. Вы можете использовать его в Rails для кеширования переменных экземпляра в моделях.
Быстрый пример на основе Rails, где мы создаем функцию для выборки текущего пользователя, вошедшего в систему:
class User > ActiveRecord::Base
def current_user
@current_user ||= User.find_by_id(session[:user_id])
end
end
Он проверяет, является ли переменная экземпляра @current_user устанавливать. Если это так, он вернет его, тем самым сохранив вызов базы данных. Однако, если он не установлен, мы выполняем вызов, а затем устанавливаем для него значение переменной @current_user. Это действительно простой метод кэширования, но он отлично подходит для случаев, когда вы несколько раз получаете одну и ту же переменную экземпляра из приложения.