diff --git a/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/README.md b/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/README.md index 7e0a1dab7f5b4..e11174c7661b8 100644 --- a/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/README.md +++ b/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/README.md @@ -189,6 +189,83 @@ function minimumPushes(word: string): number { } ``` +#### JavaScript + +```js +function minimumPushes(word) { + const cnt = Array(26).fill(0); + for (const c of word) { + ++cnt[c.charCodeAt(0) - 'a'.charCodeAt(0)]; + } + cnt.sort((a, b) => b - a); + let ans = 0; + for (let i = 0; i < 26; ++i) { + ans += (((i / 8) | 0) + 1) * cnt[i]; + } + return ans; +} +``` + + + + + + + +### 方法二:优先队列(大根堆) + + + +#### TypeScript + +```ts +function minimumPushes(word: string): number { + const pq = new MaxPriorityQueue(); + const cnt = new Map(); + let [i, res] = [0, 0]; + + for (const x of word) { + cnt.set(x, (cnt.get(x) ?? 0) + 1); + } + + for (const [x, c] of cnt) { + pq.enqueue(x, c); + } + + while (!pq.isEmpty()) { + const c = pq.dequeue().priority; + res += c * (((i++ / 8) | 0) + 1); + } + + return res; +} +``` + +#### JavaScript + +```js +function minimumPushes(word) { + const pq = new MaxPriorityQueue(); + const cnt = new Map(); + let [i, res] = [0, 0]; + + for (const x of word) { + cnt.set(x, (cnt.get(x) ?? 0) + 1); + } + + for (const [x, c] of cnt) { + pq.enqueue(x, c); + } + + while (!pq.isEmpty()) { + const c = pq.dequeue().priority; + res += c * (((i++ / 8) | 0) + 1); + } + + return res; +} +``` + diff --git a/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/README_EN.md b/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/README_EN.md index ed9a33d2f0aae..1d470861064a2 100644 --- a/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/README_EN.md +++ b/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/README_EN.md @@ -187,6 +187,83 @@ function minimumPushes(word: string): number { } ``` +#### JavaScript + +```js +function minimumPushes(word) { + const cnt = Array(26).fill(0); + for (const c of word) { + ++cnt[c.charCodeAt(0) - 'a'.charCodeAt(0)]; + } + cnt.sort((a, b) => b - a); + let ans = 0; + for (let i = 0; i < 26; ++i) { + ans += (((i / 8) | 0) + 1) * cnt[i]; + } + return ans; +} +``` + + + + + + + +### Solution 2: Priority Queue + + + +#### TypeScript + +```ts +function minimumPushes(word: string): number { + const pq = new MaxPriorityQueue(); + const cnt = new Map(); + let [i, res] = [0, 0]; + + for (const x of word) { + cnt.set(x, (cnt.get(x) ?? 0) + 1); + } + + for (const [x, c] of cnt) { + pq.enqueue(x, c); + } + + while (!pq.isEmpty()) { + const c = pq.dequeue().priority; + res += c * (((i++ / 8) | 0) + 1); + } + + return res; +} +``` + +#### JavaScript + +```js +function minimumPushes(word) { + const pq = new MaxPriorityQueue(); + const cnt = new Map(); + let [i, res] = [0, 0]; + + for (const x of word) { + cnt.set(x, (cnt.get(x) ?? 0) + 1); + } + + for (const [x, c] of cnt) { + pq.enqueue(x, c); + } + + while (!pq.isEmpty()) { + const c = pq.dequeue().priority; + res += c * (((i++ / 8) | 0) + 1); + } + + return res; +} +``` + diff --git a/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/Solution.js b/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/Solution.js new file mode 100644 index 0000000000000..67bebe50efead --- /dev/null +++ b/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/Solution.js @@ -0,0 +1,12 @@ +function minimumPushes(word) { + const cnt = Array(26).fill(0); + for (const c of word) { + ++cnt[c.charCodeAt(0) - 'a'.charCodeAt(0)]; + } + cnt.sort((a, b) => b - a); + let ans = 0; + for (let i = 0; i < 26; ++i) { + ans += (((i / 8) | 0) + 1) * cnt[i]; + } + return ans; +} diff --git a/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/Solution2.js b/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/Solution2.js new file mode 100644 index 0000000000000..f98f1bee76363 --- /dev/null +++ b/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/Solution2.js @@ -0,0 +1,20 @@ +function minimumPushes(word) { + const pq = new MaxPriorityQueue(); + const cnt = new Map(); + let [i, res] = [0, 0]; + + for (const x of word) { + cnt.set(x, (cnt.get(x) ?? 0) + 1); + } + + for (const [x, c] of cnt) { + pq.enqueue(x, c); + } + + while (!pq.isEmpty()) { + const c = pq.dequeue().priority; + res += c * (((i++ / 8) | 0) + 1); + } + + return res; +} diff --git a/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/Solution2.ts b/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/Solution2.ts new file mode 100644 index 0000000000000..7a7be327aadc7 --- /dev/null +++ b/solution/3000-3099/3016.Minimum Number of Pushes to Type Word II/Solution2.ts @@ -0,0 +1,20 @@ +function minimumPushes(word: string): number { + const pq = new MaxPriorityQueue(); + const cnt = new Map(); + let [i, res] = [0, 0]; + + for (const x of word) { + cnt.set(x, (cnt.get(x) ?? 0) + 1); + } + + for (const [x, c] of cnt) { + pq.enqueue(x, c); + } + + while (!pq.isEmpty()) { + const c = pq.dequeue().priority; + res += c * (((i++ / 8) | 0) + 1); + } + + return res; +}