日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 第 187 场周赛(1336/3107,前43.0%)

發布時間:2024/7/5 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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:

輸入:nums = [1,0,0,0,1,0,0,1], k = 2 輸出:true 解釋:每個 1 都至少相隔 2 個元素。示例 2: 輸入:nums = [1,0,0,1,0,1], k = 2 輸出:false 解釋:第二個 1 和第三個 1 之間只隔了 1 個元素。示例 3: 輸入:nums = [1,1,1,1,1], k = 0 輸出:true示例 4: 輸入:nums = [0,1,0,1], k = 1 輸出:true提示: 1 <= nums.length <= 10^5 0 <= k <= nums.length nums[i] 的值為 01

解答:

  • 先把 1 的位置存下來,然后再遍歷位置,檢查相鄰的差值
class Solution { public:bool kLengthApart(vector<int>& nums, int k) {bool flag = true;int i, count = 0, prev = -1;vector<int> pos;for(i = 0; i < nums.size(); ++i){if(nums[i] == 1)pos.push_back(i);}for(i = 0; i < int(pos.size())-1; ++i){if(pos[i+1]-pos[i] <= k){flag = false;break;}}return flag;} };

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內的該值
class Solution { public:int longestSubarray(vector<int>& nums, int limit) {multimap<int,int> m;//value, idxint i = 0, j, MAX, MIN, maxlen = 1;for(j = 0; j < nums.size(); ++j){m.insert(make_pair(nums[j],j));MIN = m.begin()->first;//map有序MAX = (--m.end())->first;if(abs(nums[j]-MIN) <= limit && abs(nums[j]-MAX) <= limit){maxlen = max(maxlen, int(m.size()));}while(!(abs(nums[j]-MIN) <= limit && abs(nums[j]-MAX) <= limit)){auto it = m.lower_bound(nums[i++]);m.erase(it);MIN = m.begin()->first;MAX = (--m.end())->first;}}return maxlen;} };

276 ms 47.1 MB


參考 大佬IK哥的解:
自己寫了下,采用map計數的方式

class Solution { public:int longestSubarray(vector<int>& nums, int limit) {map<int,int> m;//value, count計數int i = 0, j = 0, MAX, MIN, maxlen = 1;while(j < nums.size()){m[nums[j]]++;//計數MIN = m.begin()->first;MAX = (--m.end())->first;if(abs(nums[j]-MIN) <= limit && abs(nums[j]-MAX) <= limit)maxlen = max(maxlen, j-i+1);else{while(!(abs(nums[j]-MIN) <= limit && abs(nums[j]-MAX) <= limit)){m[nums[i]]--;if(m[nums[i]]==0)m.erase(nums[i]);i++;MIN = m.begin()->first;MAX = (--m.end())->first;}}j++;}return maxlen;} };

232 ms 39 MB

4. LeetCode 5403. 有序矩陣中的第 k 個最小數組和 hard

題目鏈接
給你一個 m * n 的矩陣 mat,以及一個整數 k ,矩陣中的每一行都以非遞減的順序排列。

你可以從每一行中選出 1 個元素形成一個數組。
返回所有可能數組中的第 k 個 最小 數組和。

示例 1: 輸入:mat = [[1,3,11],[2,4,6]], k = 5 輸出:7 解釋:從每一行中選出一個元素,前 k 個和最小的數組分別是: [1,2], [1,4], [3,2], [3,4], [1,6]。其中第 5 個的和是 7 。 示例 2: 輸入:mat = [[1,3,11],[2,4,6]], k = 9 輸出:17示例 3: 輸入:mat = [[1,10,10],[1,4,5],[2,3,6]], k = 7 輸出:9 解釋:從每一行中選出一個元素,前 k 個和最小的數組分別是: [1,1,2], [1,1,3], [1,4,2], [1,4,3], [1,1,6], [1,5,2], [1,5,3]。其中第 7 個的和是 9 。 示例 4: 輸入:mat = [[1,1,10],[2,2,9]], k = 7 輸出:12提示: m == mat.length n == mat.length[i] 1 <= m, n <= 40 1 <= k <= min(200, n ^ m) 1 <= mat[i][j] <= 5000 mat[i] 是一個非遞減數組

解答:
參考 IK 哥 的解答:

  • 暴力解法
  • 把第一行跟第二行,兩兩相加,取最小的 k 個出來
  • 把這些再跟第三行兩兩相加,重復下去
class Solution { public:int kthSmallest(vector<vector<int>>& mat, int k) {vector<int> ans(mat[0]);int i, j, ki;for(i = 1; i < mat.size(); ++i){multiset<int> s;for(j = 0; j < mat[i].size(); ++j){for(ki = 0; ki < ans.size(); ++ki)s.insert(mat[i][j]+ans[ki]);}ans.assign(s.begin(),s.end());ans.resize(min(k, int(ans.size())));}return ans[k-1];} };

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%)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。