LeetCode第 287 場周賽題解
阿新 • • 發佈:2022-04-08
2224. 轉化時間需要的最少運算元
題目描述:給你兩個24
小時制的時間\(a , b(a \leq b)\),每次你可以對a
增加1 , 5 , 15
或60
分鐘,問最小的操作次數使得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);
*/