Task from JS Interview: The best time to buy stock #1 | Tasks from LeetCode

  Рет қаралды 17,595

Front-end Science with Sergey Puzankov

Front-end Science with Sergey Puzankov

Күн бұрын

Пікірлер: 133
@ІльченкоАртем
@ІльченкоАртем 3 жыл бұрын
Спасибо Вам, Сергей, за эти чудесные и бесценные Ваши видео!
@frontendscience
@frontendscience 3 жыл бұрын
Рад, что было полезно!
@deniskalinin5101
@deniskalinin5101 Жыл бұрын
очень крутой контент, и подача и визуализация
@bohdanartemenko
@bohdanartemenko 3 жыл бұрын
Эти задачки - прямо то что мне нужно. Очень хорошо прокачивают вообще все)
@ВоваКоренев-м8ж
@ВоваКоренев-м8ж 2 ай бұрын
Решил на работе прокачивать своё алгоритмическое мышление, на оценку, но в целом похоже как на видео) const stocks = (arr) => { let total = 0; let minNum = arr[0]; for (let i = 0; i < arr.length; i++) { if (minNum > arr[i]) { minNum = arr[i]; } const newTotal = arr[i] - minNum; if (newTotal > total) { total = newTotal; } } return total; };
@TanTanyel
@TanTanyel 3 жыл бұрын
Через reduce, в одну строчку var numbers = [2,4,7,1,9,2]; const maxProfit = (arr) => arr.reduce((a, i) => ({m:(i < a.m ? i : a.m),p:(i-a.m > a.p ? i-a.m : a.p)}),{m:arr[0],p:0}).p; console.log(maxProfit(numbers));
@frontendscience
@frontendscience 3 жыл бұрын
Удивительно компактный но абсолютно не читаемый вариант ))) Благодарю за решение!
@vadimveksler7645
@vadimveksler7645 3 жыл бұрын
Мне на себе 2.5 года назад задали эту задачу ) Живу я в Израиле, так что эта задача актуальна так же и не в России... Похвастаюсь, я смог ее решить давольно быстро... Вакансия была на мидла JS разработчика, с тех пор я работаю в этой компании... ) Помимо этой задачки, было еще несколько на логику и тестовое на дом
@keiVision
@keiVision 3 жыл бұрын
Больше видосов - больше!!!
@frontendscience
@frontendscience 3 жыл бұрын
Окей-окей)) Утром выйдет! )))
@AzamatAbduvohidov99
@AzamatAbduvohidov99 2 жыл бұрын
👍👍
@lostsouls3151
@lostsouls3151 3 жыл бұрын
Супер!
@ВладПашковский-ц2э
@ВладПашковский-ц2э Жыл бұрын
Начал пытаться решить через указатели и потерял 2 час. А ответ был так прост :) через цикл, да и вложенность небольшая. Ну век живи век учись. function getMarge(prices) { let maxProfit = 0 let minPrice = prices[0] for (let i = 0; i < prices.length; i++) { if (prices[i] < minPrice) { minPrice = prices[i] } maxProfit = Math.max(maxProfit, prices[i] - minPrice) } return maxProfit }
@АртемМаслов-к6ъ
@АртемМаслов-к6ъ 3 жыл бұрын
Подскажите, будет ли считаться корректной вот такая запись? let maxProfit = function (prices) { let minPrice = prices[0]; let maxProfit = 0; for (let i = 0; i < prices.length; i++) { minPrice = Math.min(minPrice, prices[i]); maxProfit = Math.max(maxProfit, (prices[i] - minPrice)); } return maxProfit; }
@ewyslv
@ewyslv 2 жыл бұрын
Сергей, спасибо за разбор очередной интересной задачи!)) Случайно обнаружил, что решение не работает при const prices = [6, 8, 4, 3, 1, 2]; Вместо 1 возвращает 2. Фикс ниже в решении: С учетом возможной большой длины массива так будет не оптимальнее? const prices1 = [5, 7, 1, 3, 6, 4]; const prices2 = [6, 8, 4, 3, 1, 2]; const prices3 = [7, 6, 4, 3, 1]; const prices4 = [1]; const prices5 = [5, 7, 1, 3, 6, 8, 4]; const maxProfit = prices => { let min = Math.min(...prices); let max = Math.max(...prices); let minInd = prices.indexOf(min); let maxInd = prices.indexOf(max); if (minInd > maxInd) { const arr = prices.slice(minInd); min = Math.min(...arr); max = Math.max(...arr); } return max - min; }; console.log(maxProfit(prices1)); // 5 console.log(maxProfit(prices2)); // 1 console.log(maxProfit(prices3)); // 0 console.log(maxProfit(prices4)); // 0 console.log(maxProfit(prices5)); // 7
@UC1C0GDMTjasAdhELHZ6lZNg
@UC1C0GDMTjasAdhELHZ6lZNg 2 жыл бұрын
В твоём примере(prices2) если купить в первый день и продать во второй будет выгоднее и ответ действительно 2. А в целом можно твой вариант кода упростить, если находить максимум уже от массива prices.slice(minInd); так как в прошлое уже не вернутся и сделку не совершить. И сразу после этого возвращать max - min Но как в примере с prices2 твоё решение не универсальное.
@ЕвгенийКутовой-й6ы
@ЕвгенийКутовой-й6ы 3 жыл бұрын
как-то так понятнее показалось... Сергей, а что насчет поиска максимального через Math.max()? мое решение таким образом усложняется до O(n2)? или все так же O(n)? function maxProfit(ar){ let min = ar[0] let minIndex = 0 for(let i=0;i
@frontendscience
@frontendscience 3 жыл бұрын
Да в таком случае сложность выходит таки квадратичная O(n^2).
@ЕвгенийШут-о7н
@ЕвгенийШут-о7н 3 жыл бұрын
Крутатенюшка
@frontendscience
@frontendscience 3 жыл бұрын
Рад, что угодил! :)
@hakobandreasyan3955
@hakobandreasyan3955 2 жыл бұрын
👍👍👍👍👍👍 а так ? function maxProfit(arr) { let min = Math.min(...arr) let index = arr.indexOf(min) let max = Math.max(...arr.slice(index + 1)) return Number.isInteger(max - min) ? max - min : 0 }
@EvilYou
@EvilYou 3 жыл бұрын
Решил задачу в лоб сразу, но так и не смог найти более быстрое решение. Если просто искать минимальное число и перебирать массив, то в таком случае вернется 0: [7, 3, 6, 1]. Уже когда Сергей написал min и maxProfit, понял, что к чему. Решение в лоб (сложность O (n^2)) function maxProfit(arr) { let max = 0; for (let i = 0; i < arr.length; i++) { for (let j = i; j < arr.length; j++) { let current = arr[j] - arr[i]; max = Math.max(current, max); } } return max; } Решение тем же способом, что и в видео (сложность O (n)) function maxProfit(arr) { let min = arr[0]; let maxProfit = 0; for (let i = 0; i < arr.length; i++) { min = Math.min(min, arr[i]); let diff = arr[i] - min; if (diff > maxProfit) maxProfit = diff; } return maxProfit; }
@frontendscience
@frontendscience 3 жыл бұрын
отличные варианты решения! Благодарю!
@EvilYou
@EvilYou Жыл бұрын
В подобных задачах часто начинают с конца. Мое решение: function maxProfit(arr) { let result = 0; let max = arr[arr.length - 1]; for (let i = arr.length - 2; i >= 0; i--) { if (arr[i] >= max) { max = arr[i]; continue; } result = Math.max(result, max - arr[i]); } return result; } Результат на leetcode: Runtime 61ms Beats 99.84%
@donybrorahmanov8068
@donybrorahmanov8068 Жыл бұрын
Всем привет!
@donybrorahmanov8068
@donybrorahmanov8068 Жыл бұрын
мой вариант решения через рекурсию let input1 = [7,1,5,3,6,4] //5 let input2 = [7,6,4,3,1] // 0 let input3 = [3,4,5,3,4,1] //2 let input4 = [4,3,7,2,5,1] //4 function findBestSale(daysAndPrice,maxSum=0){ if(daysAndPrice.length === 0){ return console.log(maxSum) } let firstElem = daysAndPrice[0] for (let i=0;i
@tyomkhachatryan3820
@tyomkhachatryan3820 2 жыл бұрын
Опа! let arr = [7,1,5,3,6,4] //5 function maxProfit(arg) { let result let buy = Math.min(...arg) for (let i = 0; i < arg.length; i++) { if(arg[i] === buy){ let res = arg.slice(i, arg.length); result = Math.max(...res) - buy } } return result } console.log(maxProfit(arr))
@geri_freki
@geri_freki 3 жыл бұрын
похоже в цикле лишний шаг у вас - нужна единичка: "for (let i = 0; ..." у меня на питончике вот так: def get_max_profit(prices): min_price, max_profit = prices[0], 0 for current in prices[1:]: min_price = min(current, min_price) max_profit = max(current - min_price, max_profit) return max_profit
@frontendscience
@frontendscience 3 жыл бұрын
Похоже Вы не до конца додумали Вашу мысль. А что будет в случае, если элемента с индексом 1 нету? У меня в коде верно!
@geri_freki
@geri_freki 3 жыл бұрын
@@frontendscience oh my bad )
@numan0x
@numan0x 3 жыл бұрын
Не знаю JS, написал на питоне. Такой алгоритм: изначально maxProfit=0 1) Ищем топ1 максимальное число 2) Ищем перед ним минимальное число 3) Их разницу сравниваем с maxProfit, большее записываем в maxProfit 4) Ищем топ2 максимальное число 5) Ищем перед ним минимальное число 6) Их разницу сравниваем с maxProfit, большее записываем в maxProfit 7) ... ... ... Так до тех пор, пока очередное (топ макс число минус минимальное во всём массиве) не станет меньше, чем уже текущий maxProfit. Потому что дальше искать нет смысла. Т.е. в наборе [1, 5, 2, 2, 3] после топ1 макс числа 5 - следующее максимальное 3 и 3-1 УЖЕ меньше, чем 4. В итоге это сократит количество итераций. А искать разницу, начиная с максимальных чисел имхо тоже даст сокращение итераций. Так в наборе [1, 4, 6, 3, 9] или [1, 9, 1, 3, 6] первым делом найдётся число 9, затем 1ца перед 9кой, затем их разница 8 и дальше станет ясно что любые остальные переборы бОльшего не дадут. Т.е. в обоих наборах произойдёт 1 итерация вместо множественных. import numpy as np mas = [int(np.random.randint(0,8)) for x in range(6)] print(mas) mas_sorted = mas.copy() mas_sorted = list(set(mas_sorted))[::-1] max_profit = 0 local_min = min(mas_sorted) for i in mas_sorted: if max_profit < i - local_min: b = 1 ind = len(mas) - mas[::-1].index(i) - 1 try: minn = min(mas[:ind]) except: b = 0 if b: razn = i - minn if max_profit < razn: max_profit = razn print('max_profit', max_profit)
@alexuspro26
@alexuspro26 2 жыл бұрын
Осталось переписать range(100000000), и посмотреть как оно забуксует. А потом переписать на питоне как в ролике, и удивиться.
@aleksberg3686
@aleksberg3686 3 жыл бұрын
Не могу понять зачем два массива. Второй я понял 6 дней а первый тогда что обозначает
@frontendscience
@frontendscience 3 жыл бұрын
если вы про input1 и input2 - то это 2 тестовых массива на которых мы проверяем решение.
@aboba86468
@aboba86468 3 жыл бұрын
Кстати решение "в лоб" почему-то не проходит тест с очень большим входным набором данных на leetcode: Time Limit Exceeded. Видимо js слишком медленный для таких неоптимальных решений)
@EvilYou
@EvilYou 3 жыл бұрын
Для массива с 100 000 элементами это 10 миллиардов операций. Вычисления секунд 10 будут занимать на нормальном компе.
@aboba86468
@aboba86468 3 жыл бұрын
@@EvilYou да, но код на Java там предоставлен в качестве одного из способов решения. Его я не запускал, но аналогичный код на js вот ошибку выдаёт.
@frontendscience
@frontendscience 3 жыл бұрын
на литкод специально есть ограничение по времени - чтобы приходилось искать более оптимальные алгоритмы а не "в лоб". То что там есть решение на java в качестве примера способа решения, не значит что оно пройдет тесты.
@aboba86468
@aboba86468 3 жыл бұрын
@@frontendscience Понял, спасибо!
@iliya8708
@iliya8708 3 жыл бұрын
function test(items) { function filter(index) { return function (item, i) { return i > index; } } const result = items.reduce(function (r, c, i, arr) { var f = filter(i); var m = Math.max(...arr.filter(f)); if (r < m - c) { r=m-c; } return r; }, 0); return result; }
@frontendscience
@frontendscience 3 жыл бұрын
Благодарю за решение! К сожалению на больших масивах не проходит теты на LeetCode. Time Limit Exceeded пишет
@iliya8708
@iliya8708 3 жыл бұрын
@@frontendscience спасибо! Учту на будущее
@ДанилоПідгайний-э2в
@ДанилоПідгайний-э2в 2 жыл бұрын
const arr = [7, 1, 5, 4, 3] console.log( arr.map((item, i) => Math.max(...arr.slice(i)) - item) .reduce((a, b) => Math.max(a, b), 0) ); Трішки поїхало. Спочатку отримаємо профіт для кожного числа в масіві, потім найбільший профіт більше за 0
@evgeniichikishev2096
@evgeniichikishev2096 Жыл бұрын
почему так нельзя сделать? function profit(arr) { const min = Math.min(...arr); const indexMin = arr.indexOf(min); const max = Math.max(...(arr.slice(indexMin))); const indexMax = arr.lastIndexOf(max); return arr[indexMax] - arr[indexMin]; }
@старыйшэд
@старыйшэд 3 жыл бұрын
как так maxProfit = 5, купил же за 1 продал за 5, профит 4
@frontendscience
@frontendscience 3 жыл бұрын
купил за 1 а продал за 6 в 5й день - профит = 5
@frontendscience
@frontendscience 3 жыл бұрын
посмотрите еще раз: 1:18
@старыйшэд
@старыйшэд 3 жыл бұрын
@@frontendscience да точно
@Декопитатор321
@Декопитатор321 2 жыл бұрын
а у меня так получилось) убогое конечно решение, но мне главное что у меня получилось)) function maxProfit(prices) { let mas = [] var min = Math.min.apply(null, prices); let count = prices.indexOf(min) for(let i = 0; i < prices.length; i++){ if(prices.indexOf(prices[i]) > count){ mas.push(prices[i]) } } var max = Math.max.apply(null, mas) if(max === -Infinity){ return 0 } return max }
@whiteguards43
@whiteguards43 Жыл бұрын
А почему нельзя сделать так? Найти максимальный элемент в массиве, Math.min() нйти его индекс, и с этим индексом сделать сплай скинуть левую часть, и в оставшемся массиве сделать Math.max и отнять результат, если в оставшемся массиве макс и мин равны, то вернуть 0
@ovocado9965
@ovocado9965 Ай бұрын
var maxProfit = function(prices) { let maxProfit = 0; let minPrice = prices[0]; prices.forEach(currPrice => { minPrice = Math.min(minPrice, currPrice); maxProfit = Math.max(maxProfit, currPrice - minPrice); }) return maxProfit };
@GreenGotty
@GreenGotty 3 жыл бұрын
Вот так вышло. Не скоростью, так памятью! :) Runtime: 148 ms, faster than 27.16 % of JavaScript online submissions for Best Time to Buy and Sell Stock. Memory Usage: 48.1 MB, less than 98.57 % of JavaScript online submissions for Best Time to Buy and Sell Stock. var maxProfit = function (prices) { var min = prices[0], profit = 0; for (let i = 1; i < prices.length; i++) { const marg = prices[i] - min; if (marg < 0) { min = prices[i]; continue; } if (marg > profit) { profit = marg; } } return profit; };
@frontendscience
@frontendscience 3 жыл бұрын
Благодарю за решение! Отличный вариант!
@marksobolev9059
@marksobolev9059 Жыл бұрын
function maxProfit2(arr) { let min = arr[0]; let maxProfit = 0; for (let i = 0; i < arr.length; i++) { min = Math.min(min, arr[i]); maxProfit = Math.max(maxProfit, arr[i] - min) } return maxProfit; } как то так
@МаксимЛибер-ф2н
@МаксимЛибер-ф2н 3 жыл бұрын
У меня вот так получилось: const maxProfit = function(prices) { const min = Math.min(...prices) const max = Math.max(...(prices.slice(prices.indexOf(min)))) return max - min }; Как Вам?
@happyuaman
@happyuaman 3 жыл бұрын
У тебя оно не будет работать если самое маленькое число стоит в конце массива, к примеру вот такой массив const go = [8, 2, 6, 2, 1]; , там можно получить профит в 4 монетки, но твоя функция выдаст 0.
@frontendscience
@frontendscience 3 жыл бұрын
Там уже тебе ответили - к сожалению такой вариант не сработает. надо искать именно самую глубокую впадину и следующий за ней максимальный пик. если минимальное значение будет в самом конце - то мы не можем после него сделать покупку.
@nurtumal4655
@nurtumal4655 3 жыл бұрын
Вот мое решение на Java, получилось хуже, потратил O(n) памяти и итераций больше, хотя в идеале можно было обойтись и двумя переменными и одним циклом. public int maxProfit(int[] prices) { SortedMap map = new TreeMap(); for (int num : prices) map.merge(num, 1, Integer::sum); int res = 0; for (int num : prices) { map.merge(num, -1, Integer::sum); if (map.get(num) == 0) map.remove(num); if (map.size() > 0) res = Math.max(map.lastKey() - num, res); } return res; }
@frontendscience
@frontendscience 3 жыл бұрын
Благодарю за решение!
@ПавелФ-з3ш
@ПавелФ-з3ш 11 ай бұрын
Ни одной не решил 😢
@imbydlo1552
@imbydlo1552 3 жыл бұрын
Ничего не понял но очень интересно
@lansserrat8861
@lansserrat8861 3 жыл бұрын
Да чего тут непонятного, здесь тыкнул, там нажал, там что-то покликал - и готово!
@krkaa8663
@krkaa8663 3 жыл бұрын
function maxProfit(prices) { let largest = 0; let lowPrice = Number.MAX_VALUE; for (let i = 0; i < prices.length; i++) { if (prices[i] < lowPrice) { lowPrice = prices[i]; } else if (prices[i] - lowPrice > largest) { largest = prices[i] - lowPrice }; } return largest; }
@frontendscience
@frontendscience 3 жыл бұрын
Отличный вариант!
@ghost8652
@ghost8652 Жыл бұрын
Предлагаю свой вариант решения: const maxProfit = prices => { let maxProfit = 0; let current = 0; while (current < prices.length - 1) { if (prices[current + 1] - prices[current] > maxProfit) { maxProfit = prices[current + 1] - prices[current]; }; current++; } return maxProfit; };
@carved1883
@carved1883 2 жыл бұрын
function maxProfit(array){ let maxPrice; let minPrice; let arrTwo = []; for(let i = 0; i < array.length; i++){ if(array[i] === Math.min(...array)){ minPrice = array[i] let minIndex = array.indexOf(array[i]) arrTwo = array.splice(minIndex) maxPrice = Math.max(...arrTwo) } } console.log(maxPrice - minPrice) }
Interview Task: Brick Wall | JavaScript
10:19
Front-end Science із Сергієм Пузанковим
Рет қаралды 22 М.
Task from JS Interview: The Best Time to Buy Stocks # 2
8:40
Front-end Science із Сергієм Пузанковим
Рет қаралды 22 М.
I Sent a Subscriber to Disneyland
0:27
MrBeast
Рет қаралды 104 МЛН
OCCUPIED #shortssprintbrasil
0:37
Natan por Aí
Рет қаралды 131 МЛН
요즘유행 찍는법
0:34
오마이비키 OMV
Рет қаралды 12 МЛН
LEETCODE 121 (JAVASCRIPT) | BEST TIME TO BUY AND SELL STOCK
9:42
Как я Работаю 4 Часа в День (и Зарабатываю от 150.000 рублей / месяц)
8:27
Дмитрий Леншин | Техник от Бога
Рет қаралды 2,2 М.
How to calculate the complexity of an algorithm by BIG O | The clearest explanation!
25:44
Front-end Science із Сергієм Пузанковим
Рет қаралды 129 М.
Leetcode task. finding the maximum distance to the nearest neighbor in the cinema | JS
14:36
Front-end Science із Сергієм Пузанковим
Рет қаралды 9 М.
Sudoku problem (Hard) | Solve problems with Leetcode
33:43
Front-end Science із Сергієм Пузанковим
Рет қаралды 21 М.
REAL React Interview Questions
8:08
Peter Elbaum
Рет қаралды 201 М.
I Sent a Subscriber to Disneyland
0:27
MrBeast
Рет қаралды 104 МЛН