Ви молодий видовище програмування, який живе з вашими двома іншими найкращими друзями. Щотижня один з вас повинен виконувати всі справи в будинку, і ви вирішуєте, чия черга, вибравши палицю. Той, хто вибирає найкоротшу паличку, втрачає і виконує всі справи.
Оскільки ви всі програмісти і любите створювати пазли, ви змінили "Виберіть найкоротший паличку" в комп'ютерну головоломку.
Ось правила головоломки.
- Вам буде надана 2D матриця, де кожен стовпець являє собою паличку.
- У кожному стовпці 1 являє собою частину палички, а 0 - порожній пробіл
- Коли ви переходите зверху вниз у кожному стовпчику, спочатку у вас є
0
, і як тільки ви натиснете1
, палиця запустилася, а решта стовпця заповниться1
лише - Ви можете написати програму, щоб вибрати один стовпець. Розмір палиці в цьому стовпці визначає переможця / програв. Розмір палиці == кількість 1 в цьому стовпці.
- Однак ця програма може мати лише лінійну складність у гіршому випадку.
Оскільки ви всі програмісти, ви дізнаєтесь, чи чужа програма знімає межу складності часу.
Ваше завдання:
- Напишіть програму або функцію, яка приймає вхід у двовимірному форматі або масиві рядків.
- Введення можна взяти з STDIN / prompt / console або аргументу функції.
- Якщо ви читаєте вхід з STDIN / prompt, тоді ви можете припустити, що зчитування введення та перетворення його в масив займає 0 разів (хоча код для цього повинен бути у вашій відповіді)
- Визначте стовпчик з найдовшою паличкою в ньому.
- Вихідним може бути повернене значення функції або STDOUT / консоль / попередження.
- Програма / функція повинна мати лінійну найгіршу часову складність,
O(m+n)
деm
кількість рядків іn
кількість стовпців.
Введення може бути будь-якого з наступних форматів:
2D масив:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
Масив рядків:
[ "0000", "1000", "1101", "1111" ]
Вхід матиме такі властивості:
- Розмір масиву невідомий, припустимо прямокутник будь-якого розміру
- У будь-якому стовпці, що йде зверху вниз, якщо ви бачите 1, то все нижче буде одним
- Порожні-стовпці (тобто 0-довжина) палички мають допускається.
Це кодовий гольф, тому виграє найкоротший код ! *
Поясніть, будь ласка, свій код або надішліть версію, що не має волі (щоб перевірити складність часу), а також який із двох форматів введення, які ви очікуєте.
ОНОВЛЕННЯ Лінійна часова складність тут означає O (n + m), де n - розмір стовпця, а m - розмір рядка. (Для тих, хто був незрозумілий)
ОНОВЛЕННЯ 2 Це, безумовно, можна зробити в лінійний час. А якщо ви публікуєте відповідь, не соромтесь відкласти публікацію логіки / алгоритму на пару днів для чесної боротьби :)
ОНОВЛЕННЯ 3 Я перегляну всі відповіді за пару годин, щоб підтвердити складність часу та програму :)
1
у вході є остання комірка необхідно прочитати весь вхід. Навіть якщо стандартна бібліотека мови факсує випадковий доступ до stdin, під сценами він буферизує її, і тому час, що витрачається, становить Omega (n * m).