leetcode 第292场周赛

这篇博客总结了LeetCode周赛中的几道算法题目,包括寻找字符串中最大的3位相同数字、统计值等于子树平均值的节点数、计算打字方案数以及检查括号字符串路径的合法性。通过递归、动态规划和深度优先搜索等方法,详细解析了解题思路和代码实现。
摘要由CSDN通过智能技术生成

leetcode 第292场周赛

字符串中最大的 3 位相同数字

原题链接

算法标签 字符串 模拟

代码

class Solution {
public:
    string largestGoodInteger(string num) {
        int res=-1;
        for(int i=0;i<num.size()-2;++i){
            if(num[i]==num[i+1]&&num[i]==num[i+2]){
                res = max(res, (num[i]-'0')*100+(num[i+1]-'0')*10+num[i+2]-'0');
            }
        }
        if(!res){
            return "000";
        }
        if(res==-1){
            return "";
        }
        return to_string(res);
    }
};

统计值等于子树平均值的节点数

原题链接

算法标签 树 递归

函数类型定义为vector,可返回数组类型{element1, element2,…}

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int ans = 0;
	vector<int> getSum(TreeNode* root) {
		if (!root) return { 0,0 };
		int count = 1, sum = root->val;
		vector<int> left = getSum(root->left);
		vector<int> right = getSum(root->right);
		count += left[0];
		count += right[0];
		sum += left[1];
		sum += right[1];
		if (sum / count == root->val) ans += 1;
		return { count,sum };
	}
	int averageOfSubtree(TreeNode* root) {
		ans = 0;
        getSum(root);
		return ans;
	}
};

统计打字方案数

原题链接

算法标签 线性DP

思路

闫氏DP分析法
状态表示 f[i] 以pressKey[i]结尾的全部集合
状态属性 个数
状态计算
如果只有一个字符时,仅有一种方案,以“2”为例子:只能为“a
f[0] = 0
对于任意非7, 9, 这类数字具有一下特征(以2为例)
2 → \rightarrow a 数量 1
22 → \rightarrow aa b 数量 2
222 → \rightarrow aaa ba ab c 数量 4
即f[i] = f[i - 1] + f[i - 2] + f[i - 3]
对于9, 7 ,这类数字具有一下特征(以7为例)
7 → \rightarrow p 数量 1
77 → \rightarrow pp q 数量 2
777 → \rightarrow ppp qp pq r 数量 4
7777 → \rightarrow pppp qpp pqp rp qq pr s 数量 7
即f[i] = f[i - 1] + f[i - 2] + f[i - 3] + f[i - 4]

代码

int m = 1e9+7;
class Solution {
public:
    int countTexts(string p) {
        int n = p.size();
        vector<long long> f(n+1);
        f[0] = f[1] = 1;
        for(int i = 1; i < n; ++i) {
            f[i+1] = f[i];
            if(p[i] == p[i-1]) {
                f[i+1] += f[i-1];
                if(i>=2 && p[i]==p[i-2]) f[i+1] += f[i-2];
                if(i>=3 && (p[i] == '7' || p[i] == '9') && p[i]==p[i-2] && p[i]==p[i-3]) f[i+1] += f[i-3];
                f[i+1] %= m;
            }
        }
        return f[n];
    }
};

检查是否有合法括号字符串路径

原题链接

算法标签 DFS

思路 见代码

代码

class Solution {
public:
    bool vis[105][105][205];
    bool hasValidPath(vector<vector<char>> &grid) {
        int m = grid.size(),n = grid[0].size();
        //首先对于行列和是否为偶数  以及  第一个和最后一个的判断,剪枝判断
        if((m+n)&1&&grid[0][0]==')'||grid[m-1][n-1]=='(')
            return false;
        return dfs(grid,0,0,0);
    }

    bool dfs(vector<vector<char>> &grid,int x,int y,int c){
        int m = grid.size(),n = grid[0].size();
        //对于'('采取+1操作,对于')'采取-1操作,那么对于同一坐标下的状态就有至多m+n种
        //(因为只有右和下,序列s最长也就m+n)

        //走到最后了,发现c == 1,那这个时候就是满足条件的,
        //因为我已经排除了最后是'('的情况,因此算上最后的')',就是0
        if(x == m-1&&y == n-1)
            return c == 1;
        //这种情况是,前面累积还有c个'('没消除,就算我后面全都要')'来抵消,也消不完,false
        //m-x+n-y-2+1 = (m-1-x) + (n-1-y) + 1     
        //前面两项就是正常的算后面还有几个,+1是因为我当前过来的x y对应的那个括号还没算,因此还要算上这个
        if(c > m-x+n-y-2+1)
            return false;

        //第二个情况是当前坐标的状态c被访问过了,那就代表之前走过从当前开始的这条路,并且没有true,那就没必要走了
        if(vis[x][y][c])
            return false;
        //当前状态还没走过,那就标志位置为true
        vis[x][y][c] = true;
        //算上本次加上括号的状态
        c += grid[x][y]=='('?1:-1;

        //说明抵消完还有')',没必要往下走了
        if(c < 0)
            return false;
        //向下,向右,只要一个存在路径就行
        return (x < m-1&&dfs(grid,x+1,y,c))||(y < n-1&&dfs(grid,x,y+1,c));
    }
};

原题解链接

原创不易 转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞滕人生TYF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值