【leetcode】第 181 场周赛
第一次做周赛,只做出了两道题,主要问题是数学基础不牢并且对于字符串KMP算法没掌握。
5364. 按既定顺序创建目标数组
因为数据量比较小,所以采取了暴力直接insert。
/*
输入:nums = [0,1,2,3,4], index = [0,1,2,2,1]
输出:[0,4,1,3,2]
解释:
nums index target
0 0 [0]
1 1 [0,1]
2 2 [0,1,2]
3 2 [0,1,3,2]
4 1 [0,4,1,3,2]
*/
class Solution {
public:
vector<int> createTargetArray(vector<int>& nums, vector<int>& index) {
int len = nums.size();
vector<int> res(len,-1);
int insert;
int temp;
for(int i=0; i<len; ++i){
insert = index[i];
if(res[insert]==-1){
res[insert] = nums[i];
}
else{
int j=insert;
int pre = nums[i];
while(res[j]!=-1){
temp = res[j];
res[j] = pre;
pre = temp;
j++;
}
res[j] = pre;
}
}
return res;
}
};
5178. 四因数
没做出来,暴力解法。
/*
输入:nums = [21,4,7]
输出:32
解释:
21 有 4 个因数:1, 3, 7, 21
4 有 3 个因数:1, 2, 4
7 有 2 个因数:1, 7
答案仅为 21 的所有因数的和。
*/
class Solution {
public:
int sumFourDivisors(vector<int>& nums) {
int res = 0;
for (auto x : nums) {
int cnt = 2, sum = 1+x;
for (int i = 2; i*i <= x; ++i) {
if (i*i == x) {
cnt++;
break;
}
if (x%i == 0) {
cnt += 2;
sum += i + x/i;
}
if (cnt > 4) break;
}
if (cnt == 4) res += sum;
}
return res;
}
};
5366. 检查网格中是否存在有效路径
bfs套路+复制粘贴
/*
给你一个 m x n 的网格 grid。网格里的每个单元都代表一条街道。grid[i][j] 的街道可以是:
1 表示连接左单元格和右单元格的街道。
2 表示连接上单元格和下单元格的街道。
3 表示连接左单元格和下单元格的街道。
4 表示连接右单元格和下单元格的街道。
5 表示连接左单元格和上单元格的街道。
6 表示连接右单元格和上单元格的街道。
*/
class Solution {
public:
queue<pair<int, int> > q;
bool hasValidPath(vector<vector<int> >& grid) {
int row = grid.size();
int col = grid[0].size();
vector<vector<int> > visited(row, vector<int>(col, false));
q.push(make_pair(0,0));
visited[0][0] = -1;
while(!q.empty()){
pair<int, int> temp = q.front();
q.pop();
if(temp.first==row-1 and temp.second==col-1) return true;
int key = grid[temp.first][temp.second];
//generate
generate(temp.first, temp.second, key, grid, visited);
}
return false;
}
void generate(int i, int j, int key, vector<vector<int> >& grid, vector<vector<int> >& visited){
int row = grid.size();
int col = grid[0].size();
switch (key)
{
case 1:{ //左右
if(j-1>=0 and (grid[i][j-1]==1 or grid[i][j-1]==4 or grid[i][j-1]==6) and visited[i][j-1]!=-1) {visited[i][j-1]=-1, q.push(make_pair(i, j-1));}
if(j+1<col and (grid[i][j+1]==1 or grid[i][j+1]==3 or grid[i][j+1]==5) and visited[i][j+1]!=-1) {visited[i][j+1]=-1, q.push(make_pair(i, j+1));}
break;
}
case 2:{ //上下
if(i-1>=0 and (grid[i-1][j]==2 or grid[i-1][j]==3 or grid[i-1][j]==4) and visited[i-1][j]!=-1) {visited[i-1][j]=-1, q.push(make_pair(i-1, j));}
if(i+1<row and (grid[i+1][j]==2 or grid[i+1][j]==5 or grid[i+1][j]==6) and visited[i+1][j]!=-1) {visited[i+1][j]=-1, q.push(make_pair(i+1, j));}
break;
}
case 3:{ //左下
if(j-1>=0 and (grid[i][j-1]==1 or grid[i][j-1]==4 or grid[i][j-1]==6) and visited[i][j-1]!=-1) {visited[i][j-1]=-1, q.push(make_pair(i, j-1));}
if(i+1<row and (grid[i+1][j]==2 or grid[i+1][j]==5 or grid[i+1][j]==6) and visited[i+1][j]!=-1) {visited[i+1][j]=-1, q.push(make_pair(i+1, j));}
break;
}
case 4:{ //右下
if(j+1<col and (grid[i][j+1]==1 or grid[i][j+1]==3 or grid[i][j+1]==5) and visited[i][j+1]!=-1) {visited[i][j+1]=-1, q.push(make_pair(i, j+1));}
if(i+1<row and (grid[i+1][j]==2 or grid[i+1][j]==5 or grid[i+1][j]==6)and visited[i+1][j]!=-1) {visited[i+1][j]=-1, q.push(make_pair(i+1, j));}
break;
}
case 5:{ //左上
if(j-1>=0 and (grid[i][j-1]==1 or grid[i][j-1]==4 or grid[i][j-1]==6) and visited[i][j-1]!=-1) {visited[i][j-1]=-1, q.push(make_pair(i, j-1));}
if(i-1>=0 and (grid[i-1][j]==2 or grid[i-1][j]==3 or grid[i-1][j]==4) and visited[i-1][j]!=-1) {visited[i-1][j]=-1, q.push(make_pair(i-1, j));}
}
case 6:{ //右上
if(j+1<col and (grid[i][j+1]==1 or grid[i][j+1]==3 or grid[i][j+1]==5) and visited[i][j+1]!=-1) {visited[i][j+1]=-1, q.push(make_pair(i, j+1));}
if(i-1>=0 and (grid[i-1][j]==2 or grid[i-1][j]==3 or grid[i-1][j]==4) and visited[i-1][j]!=-1) {visited[i-1][j]=-1, q.push(make_pair(i-1, j));}
}
}
}
};
5367. 最长快乐前缀
其实就是求next的数组。
class Solution {
public:
string longestPrefix(string s) {
//求next
int len = s.size();
vector<int> next(len+1);
next[0] = -1;
int k = -1;
int j = 0;
while (j < len){
if(k==-1 or s[k]==s[j]) {
k++;
j++;
next[j] = k;
}
else k=next[k];
}
return s.substr(0,next[len]);
}
};