Viktor
https://www.hackerrank.com/challenges/max-array-sum/problem?h_l=interview&playlist_slugs%5B%5D=interview-preparation-kit&playlist_slugs%5B%5D=dynamic-programming
Viktor
https://leetcode.com/problems/house-robber/
Она же, но в другой обертке? Прикольно
Viktor
На хакерранке значится как медиум. Я считаю это фигня: везде где без дп не решить без тайм лимита — это хард.
Порридж В Ко-ливинге
Она же, но в другой обертке? Прикольно
Почти, только в этой есть отрицательные числа, поэтому надо еще кое-что обрабатывать
Порридж В Ко-ливинге
Она же, но в другой обертке? Прикольно
Это у меня cntl + c, cntl + v: 8/33 test cases failed
Viktor
Ага, ясно. Если интересно — потом скину свой вариант на ревью, с комментами. Интересно ревью комментов 😆
Порридж В Ко-ливинге
Ок)
Evgeniy
На хакерранке значится как медиум. Я считаю это фигня: везде где без дп не решить без тайм лимита — это хард.
Там еще интересный вариант есть, когда дома кольцом стоят, а не вдоль улицы
Порридж В Ко-ливинге
Viktor
Там еще интересный вариант есть, когда дома кольцом стоят, а не вдоль улицы
Типа надо ещё учитывать связь последнего и первого?
Evgeniy
Т.е. первый и последний грабить нельзя
Evgeniy
Давно у нас медленный режим?)
Порридж В Ко-ливинге
Evgeniy
С мобильного писал, не нарывался 😄
Viktor
Давно у нас медленный режим?)
Сильно мешает? Я поставил тротл чтобы ограничивать поток однострочных сообщений, проще поправить свой прошлый текст. Но если мешает могу убрать, давай ревью :-)
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Не думал, что так быстро догадаюсь как пофиксить
Порридж В Ко-ливинге
Хотя, оно было и очевидным, но я 5 минут потратил на то, чтобы просто догадаться добавить else: prev = 0
Порридж В Ко-ливинге
Не думал, что так быстро догадаюсь как пофиксить
Кому-нибудь пояснение нужно? Или “гениальное просто” 🤣?
Порридж В Ко-ливинге
Не думал, что так быстро догадаюсь как пофиксить
Так даже лучше: def maxSubsetSum(arr): sum1 = sum2 = prev = 0 for n in arr: sum1 = max(sum2 - prev + n, sum1 + n, sum1) sum1, sum2 = sum2, sum1 prev = max(n, 0) return max(sum1, sum2)
Viktor
Не думал, что так быстро догадаюсь как пофиксить
Вот ты тоже делаешь оптимизацию по памяти из-за которой не фига не понять суть решения 😅
Viktor
Оптимизацию? Там же O(1)
Вот именно. А если держать два вектора хоть как-то ещё можно объяснить решение. Иначе магия.
Порридж В Ко-ливинге
Viktor
https://www.codepile.net/pile/D1BWOX0E
Viktor
Ааа, щас объясню почему нам не нужны вектора
Мне интересно как можно додуматься до О(1) не пройдя вариант с дополнительной памятью сначала.
Порридж В Ко-ливинге
Мне интересно как можно додуматься до О(1) не пройдя вариант с дополнительной памятью сначала.
Не признаный гений. Шучу, я же решал Литкодовскую задачу про грабителей, а эта очень похожа
Viktor
Не признаный гений. Шучу, я же решал Литкодовскую задачу про грабителей, а эта очень похожа
Нормальная тема. Я хочу в идеале в разборах задач стремиться к последовательному переходу к оптимальному решению. Не люблю эти посты на литкоде типа “beats 99%”, открываешь — а там криптокод, хз в чем идея.
Порридж В Ко-ливинге
Нормальная тема. Я хочу в идеале в разборах задач стремиться к последовательному переходу к оптимальному решению. Не люблю эти посты на литкоде типа “beats 99%”, открываешь — а там криптокод, хз в чем идея.
Пхаха, ну я щас объясню) У вас решение такое же кстати, только dp1[i-1] с dp2[i-1], путает немного, т.к. кажется что работаем с один и тем же числом, под индексом i-1, а на самом деле это i-1 и i-2
Viktor
Пхаха, ну я щас объясню) У вас решение такое же кстати, только dp1[i-1] с dp2[i-1], путает немного, т.к. кажется что работаем с один и тем же числом, под индексом i-1, а на самом деле это i-1 и i-2
Вот мне кажется напротив не путает: держим две максимальные суммы, чтобы иметь возможность не включать соседние элементы. А после замечаешь, что вообще-то можно и двумя переменными обойтись, потому что суммы дальше i - 2 и не нужны. Но это уже оптимизация.
Viktor
А когда люди с листа пишут с двумя переменными — это колдунство.
Viktor
По сути у нас одинаковые решения) Просто вы храните все результаты
Именно. Я поэтому и говорю, что с двумя переменными то же самое, только скрывает идею, как по мне.
Evgeniy
Слушайте, чего-то залип на вот этой дпшке https://leetcode.com/explore/challenge/card/october-leetcoding-challenge/563/week-5-october-29th-october-31st/3513/
Viktor
А когда люди с листа пишут с двумя переменными — это колдунство.
Ну то есть в идеале на собесе я бы ожидал сперва перебор всех частичных сумм, потом переход к дп. И это уже хорошо!
Evgeniy
Написал так, но не проходит свой тест public class Solution { public int FindNumberOfLIS(int[] nums) { int len = nums.Length; if (len <= 1) return len; int[] lengths = new int[len]; for (int i = 0; i < len; i++) lengths[i] = 1; int index = 1; int number = len; while (index < len) { int maxlen = 0; for (int j = 0; j < index; j++) { if (nums[j] >= nums[index]) continue; if (lengths[j] + 1 > maxlen) { number = 1; maxlen = lengths[index] = lengths[j] + 1; } else if (lengths[j] + 1 == maxlen) { number++; lengths[index] = lengths[j] + 1; } } index++; } return number; } }
Viktor
Но это не наброс на твоё решение @Glazomer47 , если что
Evgeniy
Вот тест: [0,1,1,5,3,6] У меня выдает 2, а надо 4
Evgeniy
Может есть у кого идеи, как поправить?
Viktor
Может есть у кого идеи, как поправить?
Сорян, я малость не дома. Гляну позже.
Viktor
Порридж В Ко-ливинге
А когда люди с листа пишут с двумя переменными — это колдунство.
Объясняю про грабителей сначала (где только положительные числа): У нас каждое число есть вариант: брать или не брать, я предлагаю БРАТЬ каждый раз (`sum1 + n`), но в случае чего отказываться от предыдущего результата (`sum2 - prev + n`). т.е. 3+ раза НЕ брать нам никогда не выгодно (только положительные в это задачке), т.е. у нас будет такие ситуации: 0) Пропускать 0 раз нам запрещено, это было бы просто суммой всех элементов 1) Пропускаем 1 раз. Мы постоянно чередуем, т.е. идет игра на повышение (1,2,3,4,5 – каждый раз хотим сбросить предыдущий и взять новый, но тогда нам надо будет чередовать **ВСЕГО 2 СУММЫ**) 2) Пропускаем 2 раза. Мы *обрезаем* наши предыдущие результаты, нам не важно что было до этого, у нас идут числа 100 1 1 100 (т.е. нам единички вообще не надо брать), в этом случае sum1 == sum2 def maxSubsetSum(arr): sum1 = sum2 = prev = 0 for n in arr: sum1 = max(sum2 - prev + n, sum1 + n) sum1, sum2 = sum2, sum1 prev = n return max(sum1, sum2)
Evgeniy
Хорошего отдыха. Под вечер самое-то
Viktor
Хорошего отдыха. Под вечер самое-то
Какой там отдых, я качаю тут всех 🙈
Evgeniy
Какой там отдых, я качаю тут всех 🙈
Ну это не те нагрузки же, а полезные! 😁
Порридж В Ко-ливинге
Объясняю про грабителей сначала (где только положительные числа): У нас каждое число есть вариант: брать или не брать, я предлагаю БРАТЬ каждый раз (`sum1 + n`), но в случае чего отказываться от предыдущего результата (`sum2 - prev + n`). т.е. 3+ раза НЕ брать нам никогда не выгодно (только положительные в это задачке), т.е. у нас будет такие ситуации: 0) Пропускать 0 раз нам запрещено, это было бы просто суммой всех элементов 1) Пропускаем 1 раз. Мы постоянно чередуем, т.е. идет игра на повышение (1,2,3,4,5 – каждый раз хотим сбросить предыдущий и взять новый, но тогда нам надо будет чередовать **ВСЕГО 2 СУММЫ**) 2) Пропускаем 2 раза. Мы *обрезаем* наши предыдущие результаты, нам не важно что было до этого, у нас идут числа 100 1 1 100 (т.е. нам единички вообще не надо брать), в этом случае sum1 == sum2 def maxSubsetSum(arr): sum1 = sum2 = prev = 0 for n in arr: sum1 = max(sum2 - prev + n, sum1 + n) sum1, sum2 = sum2, sum1 prev = n return max(sum1, sum2)
С отрицательными числами все тоже самое, только мы можем пропускать больше 2 раз, т.к. мы не хотим прибовлять отрицательные числа max( , , sum1), + т.к. мы пропускает, то надо делать предыдущий элемент 0, т.е. prev = max(n, 0)
Viktor
По-людски объяснил.
Порридж В Ко-ливинге
По-людски объяснил.
Я так не умею) Скорее всего вы не поняли, но я старался)
Порридж В Ко-ливинге
Мне девушка говорит что за 2 года я так и не научился общаться с людьми))0) Мне очень сложно что-либо объяснять
Viktor
Все мы учимся общаться с людьми с переменными успехом.
Viktor
Просто с какого-то уровня — объяснять это прямо фултайм работа. Порой «программируешь» в гуглодоках.
Viktor
Ну а что, это так устроено. Много ли Джефф Дин программирует? Мне кажется только для себя, на литкод раз в неделю заходит 😄
Порридж В Ко-ливинге
Ну а что, это так устроено. Много ли Джефф Дин программирует? Мне кажется только для себя, на литкод раз в неделю заходит 😄
Да я понимаю, управлять персоналом всегда выгоднее чем работать. Кончено работать можно как 100 программистов, но в итоге руководить и управлять 200стами, выгоднее. Или управлять 50ю, чтобы каждый работал как 3
Порридж В Ко-ливинге
В итоге все самые богатые люди не те, кто что-то придумывают, а те, что организовывают. Это частично исправляется патентами
Viktor
Да я понимаю, управлять персоналом всегда выгоднее чем работать. Кончено работать можно как 100 программистов, но в итоге руководить и управлять 200стами, выгоднее. Или управлять 50ю, чтобы каждый работал как 3
Ну, я не думаю, что он руководит сотнями программистов. Скорее десятками и находится очень близко к реальному проекту. Такой вариант меня вполне устраивает.
Порридж В Ко-ливинге
Учить 10 людей, как делать 100 программистов в 2 раза эфективнее
Порридж В Ко-ливинге
Это 1 человек как 1000 программистов
Viktor
А еще выгодно руководить теми, кто руководит программистами
В фангах есть плюс в том, что инженерный трек может быть практически таким же выгодным, как управленческий.
Порридж В Ко-ливинге
Имеешь в виду горизонтальное и вертикальное развитие?
Нет, Тех Лид зарабатывает столько же, сколько и менеджер
Порридж В Ко-ливинге
“Born in Madurai, India, Pichai earned his degree from the Indian Institute of Technology Kharagpur in metallurgical engineering. Moving to the United States, he attained an M.S. from Stanford University in materials science and engineering”
Evgeniy
Ну в первом случае ты прокачиваешься как программист, старший, ведущий. А втором перестаешь быть программистом и всё больше занимаешься организационной работой.
Порридж В Ко-ливинге
“Born in Madurai, India, Pichai earned his degree from the Indian Institute of Technology Kharagpur in metallurgical engineering. Moving to the United States, he attained an M.S. from Stanford University in materials science and engineering”
Короче оканчивал на инжинере по металам, а окончил управлением самой огромной компание программистов
Viktor
Ну в первом случае ты прокачиваешься как программист, старший, ведущий. А втором перестаешь быть программистом и всё больше занимаешься организационной работой.
Ну вот такого нет. Это ортогональные истории: заниматься архитектурой и проектами, и заниматься людьми, наймом и финансами.
Evgeniy
Понятно
Viktor
"Диплом не нужен!" (с) 😄
Ахаха. Рубрика вредные советы.