class Solution {
public:
string largestGoodInteger(string num) {
int res=-1;
for(int i=0;i
/**
* 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 getSum(TreeNode* root) {
if (!root) return { 0,0 };
int count = 1, sum = root->val;
vector left = getSum(root->left);
vector 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分析法
状态表示 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 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];
}
};
class Solution {
public:
bool vis[105][105][205];
bool hasValidPath(vector> &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> &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));
}
};