-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path122-best-time-to-buy-and-sell-stock-ii.js
130 lines (106 loc) · 4.28 KB
/
122-best-time-to-buy-and-sell-stock-ii.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// 122. Best Time to Buy and Sell Stock II
// https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/
/*
Say you have an array prices for which the ith element is the price of a given
stock on day i.
Design an algorithm to find the maximum profit. You may complete as many
transactions as you like (i.e., buy one and sell one share of the stock multiple
times).
Note: You may not engage in multiple transactions at the same time (i.e., you
must sell the stock before you buy again).
Constraints:
- 1 <= prices.length <= 3 * 10 ^ 4
- 0 <= prices[i] <= 10 ^ 4
*/
import { strictEqual } from 'assert';
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Runtime: 56 ms, faster than 84.11% of JavaScript online submissions
// Memory Usage: 36.3 MB, less than 23.81% of JavaScript online submissions
// /**
// * @param {number[]} prices
// * @return {number}
// */
// const maxProfit = prices => {
// let profit = 0;
// for (let i = 0, lo = Infinity, hi = -Infinity; i < prices.length; i++) {
// [lo, hi] = [Math.min(lo, prices[i]), Math.max(hi, prices[i])];
// if (prices[i + 1] < prices[i] || i === prices.length - 1) {
// profit += hi - lo;
// [lo, hi] = [Infinity, -Infinity];
// }
// }
// return profit;
// };
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Runtime: 60 ms, faster than 64.98% of JavaScript online submissions
// Memory Usage: 36.5 MB, less than 23.81% of JavaScript online submissions
// /**
// * @param {number[]} prices
// * @return {number}
// */
// const maxProfit = prices =>
// prices
// .map((price, idx) => prices[idx + 1] - price)
// .filter(n => 0 < n)
// .reduce((acc, curr) => acc + curr, 0);
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// /**
// * @param {number[]} prices
// * @return {number}
// */
// const maxProfit = prices =>
// prices
// .map((price, idx) => prices[idx + 1] - price)
// .filter(n => 0 < n)
// .reduce((acc, curr) => acc + curr, 0);
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// /**
// * @param {number[]} prices
// * @return {number}
// */
// const maxProfit = prices =>
// prices.reduce(
// (profit, priceToday, idx) =>
// profit +
// (priceToday < prices[idx + 1] ? prices[idx + 1] - priceToday : 0),
// 0,
// );
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Runtime: 68 ms, faster than 32.11% of JavaScript online submissions
// Memory Usage: 36.6 MB, less than 23.81% of JavaScript online submissions
/**
* You have a time travel machine that can only go back 1 day.
* You will use it to exploit the stock market.
* But somehow had infinite money to start with. (Whatever.)
*
* @param {number[]} prices
* @return {number}
*/
const maxProfit = prices => {
// Start with nothing and take every profitable opportunity from time travel
let profit = 0;
// Start from the second day (because that is the first day you could sell)
for (let i = 1; i < prices.length; i++) {
// Our Delorean only goes back 1 day, but that is all we need
const [priceYesterday, priceToday] = [prices[i - 1], prices[i]];
// Whenever there is profit, engage that Flux Capacitor!
if (priceYesterday < priceToday) profit += priceToday - priceYesterday;
// Buy yesterday; sell today
}
// Take every Monday off!
return profit;
// Time travel trading makes every weekend is a three-day weekend!
};
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Example 1:
strictEqual(maxProfit([7, 1, 5, 3, 6, 4]), 7);
// Explanation: Buy on day 2 (price = 1) and sell on day 3 (price = 5), profit = 5-1 = 4.
// Then buy on day 4 (price = 3) and sell on day 5 (price = 6), profit = 6-3 = 3.
// Example 2:
strictEqual(maxProfit([1, 2, 3, 4, 5]), 4);
// Explanation: Buy on day 1 (price = 1) and sell on day 5 (price = 5), profit = 5-1 = 4.
// Note that you cannot buy on day 1, buy on day 2 and sell them later, as you are
// engaging multiple transactions at the same time. You must sell before buying again.
// Example 3:
strictEqual(maxProfit([7, 6, 4, 3, 1]), 0);
// Explanation: In this case, no transaction is done, i.e. max profit = 0.