1. 程式人生 > 其它 >LeetCode第 287 場周賽題解

LeetCode第 287 場周賽題解

2224. 轉化時間需要的最少運算元

題目描述:給你兩個24小時制的時間\(a , b(a \leq b)\),每次你可以對a增加1 , 5 , 1560分鐘,問最小的操作次數使得a = b

思路:根據題意貪心即可

時間複雜度:\(O(1)\)

參考程式碼:

class Solution {
public:
    int convertTime(string s, string t) {
        int sh = 10 * (s[0] - '0') + (s[1] - '0'), sm = 10 * (s[3] - '0') + (s[4] - '0');
        int eh = 10 * (t[0] - '0') + (t[1] - '0'), em = 10 * (t[3] - '0') + (t[4] - '0');
        int res = 0;
        if(em >= sm) res += eh - sh;
        else res += eh - sh - 1 , em += 60;
        em -= sm;

        res += em / 15;
        em %= 15;
        res += em / 5;
        em %= 5;
        res += em;
        return res;
    }
};

2225. 找出輸掉零場或一場比賽的玩家

題目描述:給你\(n\)個描述\((a , b)\)表示一場比賽中玩家a贏了玩家b,問所有文明有輸掉任何比賽的玩家列表和恰好輸掉一場比賽的列表。

思路:根據題意模擬即可

時間複雜度:\(O(nlogn)\)

參考程式碼:

class Solution {
public:
    vector<vector<int>> findWinners(vector<vector<int>>& matches) {
        vector<int>win(100005 , 0) ,lose(100005 , 0);
        set<int>s;
        for(auto&& vec : matches){
            win[vec[0]]++;
            lose[vec[1]] ++;
            s.insert(vec[0]);
            s.insert(vec[1]);
        }
        vector<vector<int>> res(2);
        for(auto&& vec : s){
            if(lose[vec] == 0) res[0].push_back(vec);
            else if(lose[vec] == 1) res[1].push_back(vec);
        }
        return res;
    }
};

2226. 每個小孩最多能分到多少糖果

題目描述:給你\(n\)堆糖果,你可以將糖果分成任意大小的堆,但不能合併,有\(k\)個孩子每人獲得一堆且數量相同的糖果,問每個人分得的糖果的最大數量是多少。

思路:比較明顯的二分答案

時間複雜度:\(O(nlog\mathop{max}\limits_{i = 1}^{n}\;a_i)\)

參考程式碼:

class Solution {
public:
    int maximumCandies(vector<int>& candies, long long k) {
        int lr = 1 , rs = 1e7 + 5 , res = 0;
        auto check = [&](int mid)->bool{
            long long cnt = 0;
            for(auto&& candie : candies) cnt += candie / mid;
            return cnt >= k;
        };
        while(lr <= rs){
            int mid = lr + rs >> 1;
            if(check(mid)) res = mid , lr = mid + 1;
            else rs = mid - 1;
        }
        return res;
    }
};

2227. 加密解密字串

題目描述:自己讀題吧

思路:對於加密操作,直接進行模擬即可,對於解密操作,可以將操作反過來,將字典內的字串進行加密,然後用map儲存下來,每次詢問直接訪問map進行查詢即可,時間複雜度為\(O(logn)\)

時間複雜度:加密操作複雜度\(O(n)\),解密操作複雜度\(O(logn)\)

參考程式碼:

class Encrypter {
private:
    vector<int>idx;
    vector<vector<int>>reidx;
    vector<char> k;
    vector<string>v;
    vector<string> d;
    map<string , int>mp;
public:
    Encrypter(vector<char>& keys, vector<string>& values, vector<string>& dictionary) {
        k = keys;
        idx = vector<int>(300 , 0);
        reidx = vector<vector<int>>(10000);
        for(int i = 0 ; i < keys.size() ; ++i) idx[keys[i]] = i;
        v = values;
        d = dictionary;
        for(auto&& s : d){
            string t = encrypt(s);
            mp[t]++;
        }
    }
    
    string encrypt(string word1) {
        string res;
        for(auto&& c : word1) res += v[idx[c]];
        return res;
    }
    
    int decrypt(string word2) {
        if(mp.count(word2)) return mp[word2];
        return 0;
    }
};

/**
 * Your Encrypter object will be instantiated and called as such:
 * Encrypter* obj = new Encrypter(keys, values, dictionary);
 * string param_1 = obj->encrypt(word1);
 * int param_2 = obj->decrypt(word2);
 */