【每日算法Day 63】LeetCode 第 179 場周賽題解

起牀打開 leetcode,準備看看今天搞點啥題目水一水的,忽然發現周賽還剩 1 小時整。看了眼題目也都挺簡單的,就把 4 道題都作掉了。node

LeetCode 5352. 生成每種字符都是奇數個的字符串

題目連接

https://leetcode-cn.com/problems/generate-a-string-with-characters-that-have-odd-counts/python

題解

這題就沒什麼好說的了,若是  是奇數,那就生成  個  。若是  是偶數,那就生成  個  ,再加上  個  c++

代碼(python)

class Solution: def generateTheString(self, n: int) -> str: if n % 2 == 0: return "a"+"b"*(n-1) return "a"*n

LeetCode 5353. 燈泡開關 III

題目連接

https://leetcode-cn.com/problems/bulb-switcher-iii/web

題解

若是某一個時刻燈都是藍色的,等價於全部的亮燈都連續排列在數組最左邊,沒有間斷。因此只須要判斷當前時刻亮燈的最大編號是否等於亮燈的數量就好了。算法

比賽的時候傻 x 了,第一個想到的居然是樹狀數組,因而直接把模板套過來過了。數組

代碼(c++)

class Solution {public: int numTimesAllBlue(vector<int>& light) { int res = 0, maxx = 0; for (int i = 0, sz = light.size(); i < sz; ++i) { maxx = max(maxx, light[i]); if (maxx == i + 1) res++; } return res; }};

樹狀數組:微信

class Solution {public: static const int MAXN = 50010; int bit[MAXN];  int numTimesAllBlue(vector<int>& light) { memset(bit, 0, sizeof bit); int maxx = 0, res = 0; for (int i = 0, sz = light.size(); i < sz; ++i) { add(light[i], 1); maxx = max(maxx, light[i]); if (sum(maxx) == maxx) res++; } return res; }  int lowbit(int x) { return x&(-x); }
void add(int i, int x) { while (i < MAXN) { bit[i] += x; i += lowbit(i); } }
void sub(int i, int x) { while (i < MAXN) { bit[i] -= x; i += lowbit(i); } }
int sum(int i) { int s = 0; while (i > 0) { s += bit[i]; i -= lowbit(i); } return s; }};

LeetCode 5354. 通知全部員工所需的時間

題目連接

https://leetcode-cn.com/problems/time-needed-to-inform-all-employees/app

題解

首先根據  數組來建圖,邊權就是父結點到子結點的通知時間。而後從根結點開始作 dfs ,求出根結點到每一個葉子結點的路徑長度的最大值。編輯器

代碼(c++)

class Solution {public: static const int N = 100010; vector<int> G[N];  int numOfMinutes(int n, int headID, vector<int>& manager, vector<int>& informTime) { for (int i = 0; i < n; ++i) { if (manager[i] != -1) { G[manager[i]].push_back(i); } } return f(headID, informTime); }  int f(int headID, vector<int>& informTime) { if (!informTime[headID]) return 0; int maxx = 0; for (int i = 0, sz = G[headID].size(); i < sz; ++i) { maxx = max(maxx, f(G[headID][i], informTime)); } return maxx+informTime[headID]; }};

LeetCode 5355. T 秒後青蛙的位置

題目連接

https://leetcode-cn.com/problems/frog-position-after-t-seconds/svg

題解

首先建圖,而後從  號結點開始,仍是用 dfs 。每往下走一次,時間  減  。若是  或者到了葉子結點了,就判斷結點是否爲  ,是就返回  ,不是就返回  。每次機率除以當前結點的子結點個數,而後再乘上全部子結點 dfs 結果的最大值(由於結果不是  就是正確機率)。

代碼(c++)

class Solution {public: double frogPosition(int n, vector<vector<int>>& edges, int t, int target) { if (n == 1) return 1.0; vector<vector<int>> G(110); for (int i = 0; i < n-1; ++i) { int u = edges[i][0], v = edges[i][1]; G[u].push_back(v); G[v].push_back(u); } return dfs(1, 0, t, target, G); }  double dfs(int u, int fa, int t, int target, vector<vector<int>>& G) { int sz = G[u].size(); if (!t || (fa && sz == 1)) { if (u == target) return 1; else return 0; }  double p = 1.0 / (fa ? sz-1 : sz), maxx = 0; for (int i = 0, sz = G[u].size(); i < sz; ++i) { int v = G[u][i]; if (v == fa) continue; maxx = max(maxx, dfs(v, u, t-1, target, G)); } return p*maxx; }};

做者簡介:godweiyang知乎同名華東師範大學計算機系碩士在讀,方向天然語言處理與深度學習喜歡與人分享技術與知識,期待與你的進一步交流~


個人微信:weiyang792321264。有任何問題均可以在評論區留言,也歡迎加我微信深刻溝通~



本文分享自微信公衆號 - 算法碼上來(GodNLP)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索