周赛188
Rank:2546 / 3981 AC:1/4
5404. 用栈操作构建数组
先拿个表标记一下,然后再去遍历这个表,有的话就是Push,没有就算Push Pop
class Solution {public:vector<string> buildArray(vector<int>& target, int n) {vector<string> res;int pos = 0,f[105],m=0;fill(f,f+105,0);for(int i=0;i<target.size()&&i<=n;i++){f[target[i]]++;m = max(m,target[i]);}for(int i=1;i<=m;i++){if(f[i]){res.push_back("Push");}else {res.push_back("Push");res.push_back("Pop");}}return res;}};
5405. 形成两个异或相等数组的三元组数目
0 <= i < j <= k < arr.length, a==b就意味着a^b==0,所以arr[i]^arr[i+1]^….^a[k]==0,只要两个端点锁定,j就有k-i种可能。一个很简便的思路。
class Solution {public:int countTriplets(vector<int>& arr) {int n = arr.size(),res = 0;for(int i=0;i<n;i++){int t = arr[i];for(int j=i+1;j<n;j++){t ^= arr[j];if(t==0){res+= j-i;}}}return res;}};
5406. 收集树上所有苹果的最少时间
BFS思路,如果一条路径上有苹果,那这条路径一定会走过两遍,无论中间节点是否有苹果,只要将中间结点也标记上有苹果,然后利用BFS思路求得的路径一定是最短的,从上到下广度优先搜索,只要结点标记有苹果,就加2。
class Solution {public:int minTime(int n, vector<vector<int>>& edges, vector<bool>& hasApple) {vector<vector<int>> adj(n);for(auto& e: edges){adj[e[0]].push_back(e[1]);}while(true){int num = 0;for(int i=0;i<n;i++){num += hasApple[i]==true;}for(auto &e:edges){if(hasApple[e[1]]) hasApple[e[0]] = true;}for(int i=0;i<n;i++){num -= hasApple[i]==true;}if(num==0) break;}queue<int> qu;int res = 0;qu.push(0);while(qu.size()){int top = qu.front(); qu.pop();for(int i=0;i<adj[top].size();i++){if(hasApple[adj[top][i]]) {res++; qu.push(adj[top][i]);}}}return res*2;}};
5407. 切披萨的方案数
待补…
