第 357 场周赛 - 力扣
第 357 场周赛 - 力扣(LeetCode)
2810. 故障键盘 - 力扣(LeetCode)
如题模拟即可
class Solution {
public:
string finalString(string s) {
string ans = "";
for(int i = 0;i < s.size(); i++){
if(s[i] == 'i'){
std::reverse(ans.begin(), ans.end());
}else
ans += s[i];
}
return ans;
}
};
2811. 判断是否能拆分数组 - 力扣(LeetCode)
\(n\le2\)时总是能满足要求,\(n>3\)时,只要其中有一对相邻数大于等于\(m\),我们都可以一个一个地去掉除这两元素之外的其他元素,最后剩这两元素也满足条件
class Solution {
public:
bool canSplitArray(vector<int>& nums, int m) {
int n = nums.size();
if(n <= 2) return true;
for(int i = 1;i < n;i ++)
if(nums[i] + nums[i - 1] >= m)
return true;
return false;
}
};
2812. 找出最安全路径 - 力扣(LeetCode)(多源BFS最短路)
如果直接去找路径,那么每个点都要去计算一遍,这样在当数据大时很容易超时,所以我们可以先去预处理出每个单元格的安全系数,然后从中选出一条安全系数最大的路径即可,这样就大大降低了时间复杂度.
由于本题一个是矩阵图,所以可以用\(BFS\)计算各个单元安全系数
然后我们从\((0,0)\)开始,将每次访问顶点的四周可访问点都按\(\{安全系数,坐标\}\)存入优先队列,然后每次去选取当前路径安全系数最优的点,答案也要随着更新最小的安全系数,最后到达\((n-1,n-1)\)时返回\(ans\)即可
class Solution {
public:
int maximumSafenessFactor(vector<vector<int>>& grid) {
typedef pair<int,int> PII;
int n = grid.size();
int u[] = {1,-1,0,0};
int v[] = {0,0,1,-1};
queue<PII> Q;
vector dis(n,vector<int>(n,-1));
for (int i = 0;i < n;i ++)
for (int j = 0; j < n; ++j)
if(grid[i][j]){
Q.emplace(i,j);
dis[i][j] = 0;
}
vector vis(n,vector<bool>(n,false));
while(Q.size()){
auto [x,y] = Q.front();
Q.pop();
for(int i = 0;i < 4;i ++){
int dx = x + u[i];
int dy = y + v[i];
if(dx >= 0 && dy >= 0 && dx < n && dy < n && dis[dx][dy] < 0){
Q.emplace(dx,dy);
dis[dx][dy] = dis[x][y] + 1;
}
}
}
priority_queue<pair<int,PII>> QQ;
QQ.push({dis[0][0],{0,0}});
vis[0][0] = true;
int ans = n << 1;
while(QQ.size()){
auto [w,xy] = QQ.top();
QQ.pop();
auto [x,y] = xy;
ans = min(w,ans);
if(x == n - 1 && y == n - 1) return ans;
for(int i = 0;i < 4;i ++){
int dx = x + u[i];
int dy = y + v[i];
if(dx >= 0 && dy >= 0 && dx < n && dy < n && !vis[dx][dy]){
QQ.push({dis[dx][dy],{dx,dy}});
vis[dx][dy] = true;
}
}
}
return 0;
}
};