|
4 | 4 | * @return {number}
|
5 | 5 | */
|
6 | 6 | const minCost = (nums, cost) => {
|
7 |
| - let minCost = Infinity, diffList = []; |
| 7 | + let combined = nums.map((value, index) => ({ value, index })); |
| 8 | + combined.sort((a, b) => a.value - b.value); |
| 9 | + let sortedNums = combined.map(({ value }) => value); |
| 10 | + let sortedCost = combined.map(({ index }) => cost[index]); |
8 | 11 |
|
9 |
| - for (let i = 0; i < nums.length; i++) { |
10 |
| - let tmpList = []; |
11 |
| - for (let j = 0; j < nums.length; j++) { |
12 |
| - let curr = nums[i], comp = nums[j] |
13 |
| - if (i === j || curr === comp) continue; |
14 |
| - tmpList.push((curr > comp) ? curr - comp : comp - curr); |
15 |
| - } |
16 |
| - diffList.push(tmpList); |
| 12 | + let min = 0, prefixCost = Array.from({ length: nums.length }, () => 0); |
| 13 | + prefixCost[0] = sortedCost[0]; |
| 14 | + |
| 15 | + for (let i = 1; i < sortedNums.length; i++) { |
| 16 | + min += (sortedNums[i] - sortedNums[0]) * sortedCost[i]; |
| 17 | + } |
| 18 | + |
| 19 | + for (let i = 1; i < sortedNums.length; i++) { |
| 20 | + prefixCost[i] = prefixCost[i - 1] + sortedCost[i]; |
17 | 21 | }
|
18 | 22 |
|
19 |
| - let idx = 0; |
20 |
| - while (0 < diffList.length) { |
21 |
| - let curr = diffList.shift(), tmpCostList = [...cost], tmpCostCount = 0; |
22 |
| - tmpCostList.splice(idx, 1); |
| 23 | + let tmpMin = min; |
| 24 | + for (let i = 1; i < sortedNums.length; i++) { |
| 25 | + let gap = sortedNums[i] - sortedNums[i - 1]; |
23 | 26 |
|
24 |
| - for (let i = 0; i < curr.length; i++) { |
25 |
| - tmpCostCount += curr[i] * tmpCostList[i]; |
26 |
| - } |
| 27 | + tmpMin += prefixCost[i - 1] * gap; |
| 28 | + tmpMin -= (prefixCost[nums.length - 1] - prefixCost[i - 1]) * gap; |
27 | 29 |
|
28 |
| - minCost = Math.min(minCost, tmpCostCount); |
29 |
| - idx++; |
| 30 | + min = Math.min(min, tmpMin); |
30 | 31 | }
|
31 | 32 |
|
32 |
| - return minCost; |
| 33 | + return min; |
33 | 34 | };
|
0 commit comments