周赛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. 切披萨的方案数
待补…