【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]);
    }
};
发布了86 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36530992/article/details/105025978