iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0
佛心分享-刷題不只是刷題

8月 LeetCode Daily 見聞錄系列 第 6

[8/6] 3016. Minimum Number of Pushes to Type Word II

  • 分享至 

  • xImage
  •  

Medium
Related Topics: Hash Table / String / Greedy / Sorting / Counting
LeetCode Source

解題想法

首先,我們計算出每個 char 出現的次數,並將此紀錄在 hash table 中

其中,key 是 char,value 是 char 出現的次數

之後我們將 hash table 以 value 的數值,將它從大排到小

最後我們開始計算出每個 key 出現的次數,從大到小

除了 "1""*""#" 以及 "0"

必定只會 push 一次,其他 char 是由以下方式計算

前 8 個會有最小的 push 次數,只要 push 一次

第 9 到 16 則需要 2 次

第 17 到 24 需要 3 次

第 25 到 26 需要 4 次

我們把出現次數 * push 次數做加總即是答案

Complexity

Time Complexity: O(nlogn)
Space Complexity: O(n)

Python

class Solution:
    def minimumPushes(self, word: str) -> int:
        d = {}

        for i in range(len(word)):
            if word[i] not in d:
                d[word[i]] = 1
            else:
                d[word[i]] += 1

        nd = dict(sorted(d.items(), key=lambda x: x[1], reverse=True))

        res, count = 0, 0
        bag = []

        for k, v in nd.items():
            if k != "1" or k != "*" or k != "#" or k != "0":
                count += 1
                if count <= 8:
                    res += 1 * v
                elif count > 8 and count <= 16:
                    res += 2 * v
                elif count > 16 and count <= 24:
                    res += 3 * v
                else:
                    res += 4 * v
            else:
                res += 1 * v

        return res

C++

在 c++ 中,我們一開始得出的 hash table d 會因為要排序

透過 vector 以 pair<char, int> 存在 nd

在排序的定義中使用 lambda 定義排序規則

在 C++ 中,[] 是用來定義 lambda 表達式的符號。

在 pair 中定義 ab

我們需要將 a.second > b.second 回傳,以便將 hash table 依照 value 從大排到小

class Solution {
public:
    int minimumPushes(std::string word) {
        std::unordered_map<char, int> d;

        for (char c : word) {
            if (d.find(c) == d.end()) {
                d[c] = 1;
            } else {
                d[c] += 1;
            }
        }

        std::vector<std::pair<char, int>> nd(d.begin(), d.end());

        std::sort(nd.begin(), nd.end(), [](const std::pair<char, int>& a, const std::pair<char, int>& b) {
            return a.second > b.second;
        });

        int res = 0, count = 0;

        for (const auto& kv : nd) {
            char k = kv.first;
            int v = kv.second;

            if (k != '1' && k != '*' && k != '#' && k != '0') {
                count += 1;
                if (count <= 8) {
                    res += 1 * v;
                } else if (count > 8 && count <= 16) {
                    res += 2 * v;
                } else if (count > 16 && count <= 24) {
                    res += 3 * v;
                } else {
                    res += 4 * v;
                }
            } else {
                res += 1 * v;
            }
        }

        return res;
    }
};

上一篇
[8/5] 2053. Kth Distinct String in an Array
下一篇
[8/7] 273. Integer to English Words
系列文
8月 LeetCode Daily 見聞錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言