目录
070:判断是不是平衡二叉树
071:最大子矩阵
072:小葱的01串
070:判断是不是平衡二叉树
题目链接:判断是不是平衡二叉树_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
递归:对于左右子树,为平衡二叉树时,返回树高度,不为平衡二叉树时,返回-1
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
bool IsBalanced_Solution(TreeNode* root)
{
return dfs(root)!=-1;
}
int dfs(TreeNode* root)
{
if(root==nullptr) return 0;
int left=dfs(root->left);
if(left==-1) return -1;
int right=dfs(root->right);
if(right==-1) return -1;
return abs(right-left)<=1?max(right,left)+1:-1;
}
};
071:最大子矩阵
题目链接:最大子矩阵_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
二维前缀和简单应用:
1.枚举子矩阵
2.初始化二维前缀和
3.使用二维前缀和
#include <iostream>
using namespace std;
int dp[110][110];
int N;
int main()
{
cin>>N;
int x;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
cin>>x;
dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+x;//初始化二维数组
}
}
int ret=-127*N;//初始化为足够小的值
//使用二维数组
for(int x1=1;x1<=N;x1++)
{
for(int y1=1;y1<=N;y1++)
{
for(int x2=x1;x2<=N;x2++)
{
for(int y2=y1;y2<=N;y2++)
{
ret=max(ret,dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1]);
}
}
}
}
cout<<ret<<endl;
return 0;
}
072:小葱的01串
题目链接:小葱的01串 (nowcoder.com)
题目:
题解:
长度固定的滑动窗口
#include<iostream>
#include<string>
using namespace std;
int n;
string s;
int main()
{
cin>>n;
cin>>s;
int sum[2]={0};//统计字符串中0和1的个数
for(auto ch:s)
{
sum[ch-'0']++;
}
//滑动窗口
int left=0,right=0,ret=0,half=n/2;
int count[2]={0};//统计窗口中0和1的个数
while(right<n-1)
{
count[s[right]-'0']++;//窗口长度短了/进窗口
while(right-left+1>half)//窗口长度长了
{
count[s[left]-'0']--; //出窗口
left++;
}
if(right-left+1==half)//窗口内数据是否符合要求
{
if(count[0]*2==sum[0] && count[1]*2==sum[1])
{
ret+=2;
}
}
right++;
}
cout<<ret<<endl;
return 0;
}