|
3 | 3 | * @return {number}
|
4 | 4 | */
|
5 | 5 | const candy = (ratings) => {
|
6 |
| - let total = 0, prevSum = 1, min = 0, gap = 0;; |
7 |
| - // let total = 0, groupList = [], tmpGroupCount = 0; |
8 |
| - for (let i = 0; i < ratings.length; i++) { |
9 |
| - let curr = ratings[i], |
10 |
| - prev = (undefined === ratings[i - 1]) ? curr : ratings[i - 1], |
11 |
| - next = (undefined === ratings[i + 1]) ? curr : ratings[i + 1]; |
12 |
| - // console.log("__") |
13 |
| - // console.log(prev) |
14 |
| - // console.log(next) |
15 |
| - // let sum = ((curr > prev) || (curr > next)) ? prevSum + 1 : 1; |
16 |
| - // if () |
17 |
| - let sum = ((curr > prev) || (curr > next)) ? prevSum + 1 : 1; |
18 |
| - console.log("________________") |
19 |
| - console.log(`curr:${curr}, sum:${sum}, total:${total}`) |
20 |
| - if ((prev < curr || prev === curr) && curr > next) { // first time |
21 |
| - min = (prev === curr) ? sum - 1 : sum; |
22 |
| - sum = 0; |
23 |
| - gap++; |
24 |
| - console.log(`Setting the min for the first time min:${min}, gap:${gap}`) |
25 |
| - } else if (curr > next) { |
26 |
| - sum = 0; |
27 |
| - gap++; |
28 |
| - console.log(`going down - min:${min}, gap:${gap}`) |
29 |
| - } else if (curr < next || prev < curr || next === curr) { |
30 |
| - console.log(`going up / stagnent - min:${min}, gap:${gap}, sum:${sum}`) |
31 |
| - |
32 |
| - if (min !== 0) { |
33 |
| - sum = 0; |
34 |
| - for (let i = 0; i < gap; i++) { |
35 |
| - sum += sum + 1; |
36 |
| - console.log(`>>> sum:${sum}`) |
37 |
| - } |
38 |
| - console.log(`> sum:${sum}`) |
| 6 | + let leftList = Array(ratings.length).fill(1), |
| 7 | + rightList = Array(ratings.length).fill(1); |
39 | 8 |
|
40 |
| - sum = ((((gap + 1) > min) ? (gap + 1) : min) + sum); |
41 |
| - console.log(`>> sum:${sum}`) |
42 |
| - min = 1; |
43 |
| - gap = 1; |
44 |
| - total += sum; |
45 |
| - sum = 0; |
46 |
| - } |
| 9 | + for (let i = 0; i < ratings.length; i++) { |
| 10 | + let prev = ratings[i - 1]; |
| 11 | + if (prev === undefined) continue; |
| 12 | + if (prev < ratings[i]) { |
| 13 | + leftList[i] += leftList[i - 1]; |
47 | 14 | }
|
| 15 | + } |
48 | 16 |
|
49 |
| - total += sum; // Going down - dont add |
| 17 | + for (let i = ratings.length - 1; i >= 0; i--) { |
| 18 | + let behind = ratings[i + 1]; |
| 19 | + if (behind === undefined) continue; |
| 20 | + if (behind < ratings[i]) { |
| 21 | + rightList[i] += rightList[i + 1]; |
| 22 | + } |
| 23 | + } |
50 | 24 |
|
51 |
| - prevSum = sum; |
| 25 | + let result = 0; |
| 26 | + for (let i = 0; i < ratings.length; i++) { |
| 27 | + result += Math.max(leftList[i], rightList[i]); |
52 | 28 | }
|
53 |
| - return total; |
| 29 | + |
| 30 | + return result; |
54 | 31 | };
|
55 | 32 |
|
| 33 | +// const candy = (ratings) => { |
| 34 | +// let total = 0, prevSum = 1, min = 0, gap = 0;; |
| 35 | +// // let total = 0, groupList = [], tmpGroupCount = 0; |
| 36 | +// for (let i = 0; i < ratings.length; i++) { |
| 37 | +// let curr = ratings[i], |
| 38 | +// prev = (undefined === ratings[i - 1]) ? curr : ratings[i - 1], |
| 39 | +// next = (undefined === ratings[i + 1]) ? curr : ratings[i + 1]; |
| 40 | +// // console.log("__") |
| 41 | +// // console.log(prev) |
| 42 | +// // console.log(next) |
| 43 | +// // let sum = ((curr > prev) || (curr > next)) ? prevSum + 1 : 1; |
| 44 | +// // if () |
| 45 | +// let sum = ((curr > prev) || (curr > next)) ? prevSum + 1 : 1; |
| 46 | +// console.log("________________") |
| 47 | +// console.log(`curr:${curr}, sum:${sum}, total:${total}`) |
| 48 | +// if ((prev < curr || prev === curr) && curr > next) { // first time |
| 49 | +// min = (prev === curr) ? sum - 1 : sum; |
| 50 | +// sum = 0; |
| 51 | +// gap++; |
| 52 | +// console.log(`Setting the min for the first time min:${min}, gap:${gap}`) |
| 53 | +// } else if (curr > next) { |
| 54 | +// sum = 0; |
| 55 | +// gap++; |
| 56 | +// console.log(`going down - min:${min}, gap:${gap}`) |
| 57 | +// } else if (curr < next || prev < curr || next === curr) { |
| 58 | +// console.log(`going up / stagnent - min:${min}, gap:${gap}, sum:${sum}`) |
| 59 | +// |
| 60 | +// if (min !== 0) { |
| 61 | +// sum = 0; |
| 62 | +// for (let i = 0; i < gap; i++) { |
| 63 | +// sum += sum + 1; |
| 64 | +// console.log(`>>> sum:${sum}`) |
| 65 | +// } |
| 66 | +// console.log(`> sum:${sum}`) |
| 67 | +// |
| 68 | +// sum = ((((gap + 1) > min) ? (gap + 1) : min) + sum); |
| 69 | +// console.log(`>> sum:${sum}`) |
| 70 | +// min = 1; |
| 71 | +// gap = 1; |
| 72 | +// total += sum; |
| 73 | +// sum = 0; |
| 74 | +// } |
| 75 | +// } |
| 76 | +// |
| 77 | +// total += sum; // Going down - dont add |
| 78 | +// |
| 79 | +// prevSum = sum; |
| 80 | +// } |
| 81 | +// return total; |
| 82 | +// }; |
| 83 | + |
56 | 84 | let x = candy([1, 0, 2]); // 5
|
57 | 85 | // let x = candy([1, 2, 2]); // 4
|
58 | 86 | // let x = candy([1, 2, 87, 87, 87, 2, 1]); // 13
|
|
0 commit comments