[LeetCode] 第 204 场周赛

周赛204

1566. 重复至少 K 次且长度为 M 的模式

难度:Easy

题目描述:

[LeetCode] 第 204 场周赛_第1张图片

解题思路:

暴力法:

  • pattern的起始位置i在[0, n - m * k]之间
  • 对于i,判断后续的[i+m, i + m * k]是否满足条件
class Solution {
     
public:
    bool containsPattern(vector<int>& a, int m, int k) {
     
        int n = a.size();
        if(n < m * k) return false;
        int i, j;
        for(i = 0; i <= n - m * k; ++i) {
     
            for(j = i + m; j < i + m * k; ++j) {
     
                if(a[j] != a[j - m]) break;
            }
            if(j == i + m * k) return true;
        }
        return false;
    }
};

1567. 乘积为正数的最长子数组长度

难度:Medium

题目描述:

[LeetCode] 第 204 场周赛_第2张图片

解题思路:

  • dp[i][0]为nums[i]结尾,乘积为正数的长度
  • dp[i][1]为nums[i]结尾,乘积为负数的长度
  • 按照遍历到的数,依次更新dp数组,记录最大值
class Solution {
     
public:
    int getMaxLen(vector<int>& nums) {
     
        // dp[i][0]为nums[i]结尾,乘积为正数的长度,dp[i][1]为nums[i]结尾,乘积为负数的长度
        // 从1开始计数
        int dp[100000 + 1][2];   
        dp[0][0] = 0;
        dp[0][1] = 0;

        int res = 0;

        for(int i = 1; i <= nums.size(); i++){
     
            if(nums[i - 1] == 0){
     
                dp[i][0] = 0;
                dp[i][1] = 0;
            }else if(nums[i - 1] > 0){
     
                dp[i][0] = dp[i-1][0] + 1;
                dp[i][1] = dp[i-1][1] > 0 ? dp[i-1][1] + 1 : 0;     // 当前是正数,如果前面的负数的长度>0则可以加进去,否则到现在就是0    
            }else{
     
                dp[i][0] = dp[i-1][1] > 0 ? dp[i-1][1] + 1 : 0;     // 当前是负数
                dp[i][1] = dp[i-1][0] + 1;
            }

            res = max(res, dp[i][0]);
        }

        return res;
    }
};

1568. 使陆地分离的最少天数

难度:Hard

题目描述:

1568. 使陆地分离的最少天数

解题思路:

答案只有三种0.1.2

  • 当只有一个连通分量的时候,进行判断,返回0
  • 遍历整个棋盘,依次将1的位置变为0的时候,判断此时是否只有一个连通分量,返回1
  • 其余的情况返回2
    对于判断连通分量,使用dfs遍历所有相邻为1的点,得到区域内所有连通分量。
int dirx[] = {
     0,0,1,-1};
int diry[] = {
     -1,1,0,0};
class Solution {
     
public:
    int n,m;
    vector< vector<int> > copy;
    bool check(){
     
        int ct = 0;
        for(int i=0;i<n;i++){
     
            for(int j=0;j<m;j++){
     
                if(copy[i][j] != 0) ct++,dfs(i,j);
            }
        }
        if(ct > 1 || ct == 0) return false;
        else return true;
    }

    void dfs(int i,int j){
     
        if(copy[i][j] == 0) return ;
        copy[i][j] = 0;
        for(int k=0;k<4;k++){
     
            if(i + dirx[k] >= 0 && i + dirx[k] < n &&  j + diry[k] >= 0 && j + diry[k] < m){
     
                dfs(i + dirx[k],j + diry[k]);
            }
        }
        return ;
    }
    
    int minDays(vector<vector<int>>& grid) {
     
        n = grid.size(), m = grid[0].size();
        copy = grid;
        if(!check()) return 0; 
        for(int i=0;i<n;i++){
     
            for(int j=0;j<m;j++){
     
                if(grid[i][j] == 0) continue;
                copy = grid;
                copy[i][j] = 0;
                if(!check()) return 1;
            }
        }
        return 2;
    }
};


你可能感兴趣的:(LeetCode)