文章目录
前言
坚持刷题第44天
博客记录第2天
首先是每日一题
2100. 适合打劫银行的日子
思路
最简单的方法就是维护两个数组
一个从左向右遍历找递减序列
一个从右向左遍历找递减序列
for(int i=1;i<security.size();i++){
if(security[i]<=security[i-1]) left[i]=left[i-1]+1;
else left[i]=0;
}
for(int i=security.size()-2;i>=0;i--){
if(security[i]<=security[i+1]) right[i]=right[i+1]+1;
else right[i]=0;
}
最后从0到security.size()重新遍历一遍,如果left和right数组在这一点都满足大于等于time,则这一天符合条件
代码
class Solution {
public:
vector<int> goodDaysToRobBank(vector<int>& security, int time) {
vector<int>left(security.size(),0);
vector<int>right(security.size(),0);
for(int i=1;i<security.size();i++){
if(security[i]<=security[i-1]) left[i]=left[i-1]+1;
else left[i]=0;
}
for(int i=security.size()-2;i>=0;i--){
if(security[i]<=security[i+1]) right[i]=right[i+1]+1;
else right[i]=0;
}
vector<int>ans;
for(int i=0;i<security.size();i++){
if(left[i]>=time && right[i]>=time) ans.emplace_back(i);
}
return ans;
}
};
效率肯定是不太行的,但是今天太困了,先把刷题量搞定,更优解法以后再说吧
226. 翻转二叉树
思路
- 如果root为空,返回root
- 否则交换root->left和root->right位置,并分别对root->left和root->right的子节点进行翻转处理(递归)
代码
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(!root) return root;
swap(root->left,root->right);
root->left=invertTree(root->left);
root->right=invertTree(root->right);
return root;
}
};
112. 路径总和
思路
递归实现二叉树遍历,当左右子都为空且从根节点到此节点所有节点值相加等于目标和时,return true;其他情况都返回false
这里有个坑是找到的路径必须是要从根节点遍历到最底层的,遍历到中间相等不算,
代码
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum) {
if(!root) return false;
if(!root->left && !root->right && root->val==targetSum) return true;
return hasPathSum(root->left,targetSum-root->val) || hasPathSum(root->right,targetSum-root->val);
}
};
总结
今天时间有点紧,就刷三道吧
当前进度