当前位置:   article > 正文

2024.7.19 刷题总结

2024.7.19 刷题总结

2024.7.19

**每日一题**

3096.得到更多分数的最少关卡数目,这道题是一个考察前缀和的题目,根据题意我们需要先把数组的0转为-1,然后计算两个部分的数组和,所以我们可以现预处理出前缀和数组,然后枚举每个点作为切分点,除了最后一个点,然后判断是否符合条件,否则输出-1.

  1. class Solution {
  2. public:
  3. int minimumLevels(vector<int>& possible) {
  4. int n = possible.size();
  5. for(int i =0;i<n;i++){
  6. if(possible[i]==0) possible[i]=-1;
  7. }
  8. vector<int> sum(n,0);
  9. sum[0]=possible[0];
  10. for(int i =1;i<n;i++){
  11. sum[i]=sum[i-1]+possible[i];
  12. }
  13. for(int i =0;i<n;i++){
  14. if((i<n-1)&&(sum[i]>sum[n-1]-sum[i])){
  15. return i+1;
  16. }
  17. }
  18. return -1;
  19. }
  20. };

124.二叉树中的最大路径和,这是一道考察递归的题目,从根节点出发,类似于dfs,分别递归寻找左右节点的路径和,直到叶子节点再返回,从叶子节点往上更新以每个节点为根节点的最大路径,直到返回根节点,用一个变量来维护答案.

  1. class Solution {
  2. public:
  3. int ans = -10000000;
  4. int getSum(TreeNode* root){
  5. if(root==nullptr) return 0;
  6. int leftSum = max(getSum(root->left),0);
  7. int rightSum = max(getSum(root->right),0);
  8. int cnt = root->val+leftSum+rightSum;
  9. ans = max(ans,cnt);
  10. return root->val+max(leftSum,rightSum);
  11. }
  12. int maxPathSum(TreeNode* root) {
  13. int a = getSum(root);
  14. return ans;
  15. }
  16. };

543.二叉树的直径,这道题是一道考察递归的题目,按照树的一般算法,维护一个最大直径答案值,定义一个递归函数,开头是递归返回条件,即当前节点为空节点就返回0,否则分别往左和往右递归,维护每个节点的最大深度为左右最大深度中的最大值再加一,答案用左右节点的最大深度的和再加一来维护.

  1. class Solution {
  2. public:
  3. int ans;
  4. int depth(TreeNode* root){
  5. if(root==nullptr) return 0;
  6. int L=depth(root->left);
  7. int R=depth(root->right);
  8. ans=max(ans,L+R+1);
  9. return max(L,R)+1;
  10. }
  11. int diameterOfBinaryTree(TreeNode* root) {
  12. ans = 1;
  13. depth(root);
  14. return ans-1;
  15. }
  16. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/856566
推荐阅读
相关标签
  

闽ICP备14008679号