Порридж В Ко-ливинге
Я думаю если сортировкой сделать, то дадут другую задачку и будет hire
Evgeniy
Я тоже читал это решение
Ну я не читал, так сообразил) Проще сортировкой
Evgeniy
Хочу теперь сделать на одном хешсете и словаре
Evgeniy
В условии не сказано, что числа уникальные, поэтому придется следить за дубликатами
Viktor
Ну сортировкой то сделали?
class Solution { private: template <class I> int check(unordered_set<long long> s, I begin, I end) { int result = 0; unordered_set<long long> visited; for (auto it = begin; it != end; ++it) { int n = *it; if (visited.find(n) == visited.end()) { long long k = 1LL * n + 1; int curr = 1; while (visited.find(k) == visited.end() && s.find(k) != s.end()) { visited.insert(k); curr++; k++; } result = max(result, curr); } } return result; } public: int longestConsecutive(vector<int>& nums) { unordered_set<long long> s(nums.begin(), nums.end()); return max(max( check(s, nums.begin(), min_element(nums.begin(), nums.end())), check(s, min_element(nums.begin(), nums.end()), nums.end()) ),max( check(s, nums.rbegin(), min_element(nums.rbegin(), nums.rend())), check(s, min_element(nums.rbegin(), nums.rend()), nums.rend()) )); } }; Не, я хотел так -> бегать по цепочкам последовательных элементов, попутно помечая их как посещенные. И делать это несколько раз, до первого минимального элемента слева и справа, потом до последнего минимального элемента аналогично. Но есть хитрые тесты, которые всё ломают.
Viktor
Со словарем хорошая идея, да.
Порридж В Ко-ливинге
Но сразу на контр примерах было понятро что это школьные истории, и сложность там будет или огого, или вообщеьраь работать не будет
Viktor
Пхаха, у меня тоже были какие-то гениальные идеи с указателями и цепочками
Я на самом деле сейчас анализирую свой ход мысли и понимаю, что попался на крючок первого теста. Где у тебя последовательности возрастают, и сразу подталкивают к такому решению. Потом ты ловишь упавший тест, и вот тут начинается дорога в один конец.
Порридж В Ко-ливинге
Я на самом деле сейчас анализирую свой ход мысли и понимаю, что попался на крючок первого теста. Где у тебя последовательности возрастают, и сразу подталкивают к такому решению. Потом ты ловишь упавший тест, и вот тут начинается дорога в один конец.
Да, эти тесты надо вообще выкидывать, и умать ворст кейс, где идет 6,7,5,4,8, которые один *каким-то* хитрым спосоьом имеют олин указатель/цепочку (еще не придумали каким), а потом будет 10,12,11,13, с другой цепочкой указателсями, а под конец 9, которая меняет нашу хитрую сложность из волшеьного O(N) на O(N^2)
Порридж В Ко-ливинге
Надо просто хранить на "концах" подряд идущих значений длину
Это решение из тех, до которых почти все додумываются, ну, юзать словарь и менять значения - очевидно. Но есть вот такой маленький хитрый момент, как менять значение например, до которого хрен догадаешься. Просто ОДИН моментик такой и все)
Evgeniy
public class Solution { public int LongestConsecutive(int[] nums) { if (nums.Length <= 1) return nums.Length; HashSet<int> hset = new HashSet<int>(); Dictionary<int,int> ranges = new Dictionary<int,int>(); foreach (int n in nums) { if (hset.Contains(n)) continue; hset.Add(n); if (ranges.ContainsKey(n-1) && ranges.ContainsKey(n+1)) { int diffLeft = ranges[n-1]; int diffRight = ranges[n+1]; int len = (n+1)+diffRight-((n-1)+diffLeft); ranges[(n-1)+diffLeft] = len; ranges[(n+1)+diffRight] = -len; if (ranges[n-1] < 0) ranges.Remove(n-1); if (ranges[n+1] > 0) ranges.Remove(n+1); } else if (ranges.ContainsKey(n-1)) { int diff = ranges[n-1]; ranges[(n-1)+diff] += 1; if (ranges[n-1] < 0) ranges.Remove(n-1); ranges.Add(n, -ranges[(n-1)+diff]); } else if (ranges.ContainsKey(n+1)) { int diff = ranges[n+1]; ranges[(n+1)+diff] -= 1; if (ranges[n+1] > 0) ranges.Remove(n+1); ranges.Add(n, -ranges[(n+1)+diff]); } else { ranges.Add(n, 0); } } return ranges.Values.Max()+1; } }
Evgeniy
Решил, но нужно ещё рефакторить
Порридж В Ко-ливинге
Вообще все, что не Питон - страшно Я сеья чувствую завтсимым...
Evgeniy
Ой, страшно
Мне тоже. Поэтому упростить хочу
Порридж В Ко-ливинге
Мне тоже. Поэтому упростить хочу
Не, страшно т.к. не Питон. Зря мне Питон показали
Evgeniy
Не, страшно т.к. не Питон. Зря мне Питон показали
Зато на питоне быстро можно написать
Evgeniy
А не городить всякие конструкции
Порридж В Ко-ливинге
Зато на питоне быстро можно написать
Да черт, устал уже лениться, хочется плато текста как плюсах, или листы как в Ждаве
Evgeniy
Обратная сторона этого: если немного меняется задача, то больше вероятность переписать весь код, а не только его часть
Viktor
Да черт, устал уже лениться, хочется плато текста как плюсах, или листы как в Ждаве
окстись, лениться это нормально, не надо тебе в эту кроличью нору 🙂
Порридж В Ко-ливинге
окстись, лениться это нормально, не надо тебе в эту кроличью нору 🙂
Ну вот на собесе и буду писать на... А, я же джун 😅 Меня не спрашивают)
Viktor
Ну вот на собесе и буду писать на... А, я же джун 😅 Меня не спрашивают)
шо? вроде ж можно выбрать любой язык из списка разрешённых, нет?
Viktor
а, ну это да. есть вероятность, что и литкода там будет поменьше.
Evgeniy
Не на собес для фронта)
На фронт только js?
Evgeniy
и питон?
Порридж В Ко-ливинге
Evgeniy
https://leetcode.com/problems/longest-consecutive-sequence/discuss/918938/C-O(n)-solution-using-HashSet-and-Dictionary
Порридж В Ко-ливинге
Evgeniy
По времени, кстати, вообще никак не отразилось
Evgeniy
Там 100 мс, тут 104 мс
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Было бы 1 000 000 - заметили бы
Порридж В Ко-ливинге
Viktor
Это кто?
Viktor
У меня есть товарищ, который в Гугл устроился. Нарешал 500+ задач, ему коллеги говорят, мол, совсем уже что ли, мы максимум 100 решили. Потому что кто на что учился как говорится, и у кого какой бекграунд в алгоритмах с вуза.
Viktor
Ну и по себе могу сказать, что я многие задачи решал спустя рукава, а зря: решение есть, а в голове нет.
Порридж В Ко-ливинге
Это кто?
Поцан, который в БиВикли первее всех все решил и сказал что легко
Viktor
Да, вы говорили. Еще помню, что это говорили ему всякие олимпиадники
Там асмщики были, которые литкод не открывали даже
Viktor
Им не надо
Порридж В Ко-ливинге
Ну и по себе могу сказать, что я многие задачи решал спустя рукава, а зря: решение есть, а в голове нет.
Я наоборот, ищу самое лучшее решение, поэтому могу убить полдня на решение
Порридж В Ко-ливинге
🔥 по рейтингу его нашёл?
Он в чат по литкоду это нааписал)
Viktor
В принципе, я скучаю по временам когда занимался с Федей. Он мне предложил с ним пописать книгу по числам, вот думаю насколько мне хочется опять выпасть из жизни на год 😆
Порридж В Ко-ливинге
Viktor
Ахаха
Viktor
Главное чтобы бабки капали. А там можно чем угодно заниматься
Верно. Этим хорош Энтерпрайз при всех минусах.
Viktor
Можно свои проекты пропиливать, разработка все равно настолько медленная, что это на работу не влияет.
Порридж В Ко-ливинге
Этот наркотик паразитирует на той слабости, которая есть почти у каждого – лень
Порридж В Ко-ливинге
Ну, с первого раза, когда посмотрел решение 🤣
Порридж В Ко-ливинге
🤣🤣🤣
fovbot
Klen , вашу репутацию увеличил Агент 47. Текущая: 1
Null
Happy Monday! 👋 Задача этой недели на динамическое программирование. По-моему, является классическим примером введения в такой тип задач. https://vitkarpov.me/posts/unique-paths/
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Порридж В Ко-ливинге
Это другая задачка. Сюда в чат нельзя пересылать, поэтому просто скину фото
Порридж В Ко-ливинге
Я так и думал, что ты через комбинаторику решал бы 😃
Да, я даже вроде рассказывал. Вот Unique Paths 2 и Unique Paths 3 придется ДПшкой
Порридж В Ко-ливинге
там где стены есть? точно, точно.
Ага, придется ручками, ручками)
Порридж В Ко-ливинге
КСТАТИ, еще можно решить эту задачу не 2 heap ами, а 1им BST )
Если я не туплю, то можно хранить число + количество детей у ноды, а добавлять число туда, где меньше детей
Viktor
Брошюрка как составлять резюме от ЯНдекса