LeetCode 第 187 场周赛(1336/3107,前43.0%)
文章目錄
- 1. 比賽結果
- 2. 題目
- 1. LeetCode 5400. 旅行終點站 easy
- 2. LeetCode 5401. 是否所有 1 都至少相隔 k 個元素 medium
- 3. LeetCode 5402. 絕對差不超過限制的最長連續子數組 medium
- 4. LeetCode 5403. 有序矩陣中的第 k 個最小數組和 hard
1. 比賽結果
15分鐘做出來了 1、2 題,第3題卡了,第4題沒做,繼續加油!沖啊!
全國排名:1336 / 3107,43.0%;全球排名:5345 / 12349,43.3%
2. 題目
1. LeetCode 5400. 旅行終點站 easy
題目鏈接
給你一份旅游線路圖,該線路圖中的旅行線路用數組 paths 表示,其中 paths[i] = [cityAi, cityBi] 表示該線路將會從 cityAi 直接前往 cityBi 。
請你找出這次旅行的終點站,即沒有任何可以通往其他城市的線路的城市。
題目數據保證線路圖會形成一條不存在循環的線路,因此只會有一個旅行終點站。
示例 1: 輸入:paths = [["London","New York"],["New York","Lima"],["Lima","Sao Paulo"]] 輸出:"Sao Paulo" 解釋:從 "London" 出發,最后抵達終點站 "Sao Paulo" 。 本次旅行的路線是 "London" -> "New York" -> "Lima" -> "Sao Paulo" 。示例 2: 輸入:paths = [["B","C"],["D","B"],["C","A"]] 輸出:"A" 解釋:所有可能的線路是: "D" -> "B" -> "C" -> "A". "B" -> "C" -> "A". "C" -> "A". "A". 顯然,旅行終點站是 "A" 。示例 3: 輸入:paths = [["A","Z"]] 輸出:"Z"提示: 1 <= paths.length <= 100 paths[i].length == 2 1 <= cityAi.length, cityBi.length <= 10 cityAi != cityBi 所有字符串均由大小寫英文字母和空格字符組成。解答:
class Solution { public:string destCity(vector<vector<string>>& paths) {unordered_set<string> dist;unordered_set<string> start;for(auto p : paths){start.insert(p[0]);//加入起點if(dist.count(p[0]))//目的地包含出發dist.erase(p[0]);//刪除if(!start.count(p[1]))//不是起點dist.insert(p[1]);//插入終點集合else//p[1]是起點{if(dist.count(p[1]))dist.erase(p[1]);//終點中刪除}}return *dist.begin();} };32 ms 11.6 MB
賽后另解:圖的出入度概念,終點,只有入度,出度為0
class Solution { public:string destCity(vector<vector<string>>& paths) {unordered_map<string,int> in;unordered_map<string,int> out;for(auto p : paths){out[p[0]]++;in[p[1]]++;}for(auto in_ : in){if(out[in_.first]==0)return in_.first;}return "";} };2. LeetCode 5401. 是否所有 1 都至少相隔 k 個元素 medium
題目鏈接
給你一個由若干 0 和 1 組成的數組 nums 以及整數 k。
如果所有 1 都至少相隔 k 個元素,則返回 True ;否則,返回 False 。
示例 1:
解答:
- 先把 1 的位置存下來,然后再遍歷位置,檢查相鄰的差值
176 ms 60.2 MB
或者直接遍歷,節省空間,
class Solution { public:bool kLengthApart(vector<int>& nums, int k) {int i, prevOneIdx = -1000000;for(i = 0; i < nums.size(); ++i){if(nums[i] == 1){if(i-prevOneIdx <= k)return false;prevOneIdx = i;}}return true;} };184 ms 57.6 MB
3. LeetCode 5402. 絕對差不超過限制的最長連續子數組 medium
題目鏈接
給你一個整數數組 nums ,和一個表示限制的整數 limit,請你返回最長連續子數組的長度,該子數組中的任意兩個元素之間的絕對差必須小于或者等于 limit 。
如果不存在滿足條件的子數組,則返回 0 。
示例 1: 輸入:nums = [8,2,4,7], limit = 4 輸出:2 解釋:所有子數組如下: [8] 最大絕對差 |8-8| = 0 <= 4. [8,2] 最大絕對差 |8-2| = 6 > 4. [8,2,4] 最大絕對差 |8-2| = 6 > 4. [8,2,4,7] 最大絕對差 |8-2| = 6 > 4. [2] 最大絕對差 |2-2| = 0 <= 4. [2,4] 最大絕對差 |2-4| = 2 <= 4. [2,4,7] 最大絕對差 |2-7| = 5 > 4. [4] 最大絕對差 |4-4| = 0 <= 4. [4,7] 最大絕對差 |4-7| = 3 <= 4. [7] 最大絕對差 |7-7| = 0 <= 4. 因此,滿足題意的最長子數組的長度為 2 。示例 2: 輸入:nums = [10,1,2,4,7,2], limit = 5 輸出:4 解釋:滿足題意的最長子數組是 [2,4,7,2],其最大絕對差 |2-7| = 5 <= 5 。示例 3: 輸入:nums = [4,2,2,2,4,4,2,2], limit = 0 輸出:3提示: 1 <= nums.length <= 10^5 1 <= nums[i] <= 10^9 0 <= limit <= 10^9解題:
- 雙指針,滑動窗口,窗口內的數為了快速獲取最大最小值,采用multimap存儲
- 一旦加入的數跟MAX,MIN做差,不在范圍內,左端點向右移動,并刪除map內的該值
276 ms 47.1 MB
參考 大佬IK哥的解:
自己寫了下,采用map計數的方式
232 ms 39 MB
4. LeetCode 5403. 有序矩陣中的第 k 個最小數組和 hard
題目鏈接
給你一個 m * n 的矩陣 mat,以及一個整數 k ,矩陣中的每一行都以非遞減的順序排列。
你可以從每一行中選出 1 個元素形成一個數組。
返回所有可能數組中的第 k 個 最小 數組和。
解答:
參考 IK 哥 的解答:
- 暴力解法
- 把第一行跟第二行,兩兩相加,取最小的 k 個出來
- 把這些再跟第三行兩兩相加,重復下去
1736 ms 156.3 MB
優先隊列解題
struct cmp {bool operator()(const pair<int,vector<int>>& a, const pair<int,vector<int>>& b) const{return a.first > b.first;//小頂堆,和小的在堆頂} }; class Solution { public:int kthSmallest(vector<vector<int>>& mat, int k) {pair<int,vector<int>> tp;int i, j, s0 = 0, m = mat.size(), n = mat[0].size(), s;for(i = 0; i < m; ++i)s0 += mat[i][0];//最小的和vector<int> idx(m,0);//每行選取的下標vector<int> tempidx;priority_queue<pair<int,vector<int>>, vector<pair<int,vector<int>>>,cmp> q;q.push({s0,idx});set<vector<int>> visited;visited.insert(idx);//訪問過了while(--k){tp = q.top();s0 = tp.first;idx = tp.second;q.pop();for(i = 0; i < m; ++i){tempidx = idx;tempidx[i]++;//該行變大一點if(tempidx[i] < n && !visited.count(tempidx))//沒有訪問過該狀態{s = s0-mat[i][idx[i]]+mat[i][idx[i]+1];//DP思路求解下一次的和visited.insert(tempidx);q.push({s,tempidx});}}}return q.top().first;} };568 ms 43.4 MB
總結
以上是生活随笔為你收集整理的LeetCode 第 187 场周赛(1336/3107,前43.0%)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1297. 子串的最大
- 下一篇: LeetCode 447. 回旋镖的数量