刷题分享11_22

刷题分享

1.(力扣239)这时一道求长度为k窗口里最大值的问题,如果每一次更新窗口时都遍历一次数组,那么时间复杂度太高了。所以我们想到用单调队列来实现。
核心思路:窗口里维持的一直都是有可能变成最大值的元素,如果一个值没有可能为最大值,就将它从右侧弹出。首先先创建一个k-1的窗口,是为了可以更好的将后面的步骤 统一。然后扩窗口,将最左侧的值放入结果数组,然后判断最左侧的值是否过期,如果过期就从左侧走,然后窗口缩小。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int h=0;int t=0;
        int que[100001]={0};
        for(int i=0;i<k-1;i++){//构造了k-1
            while(h>t&&nums[que[h-1]]<=nums[i]){
                h--;
            }
            que[h]=i;
            h++;
        }
        int num=nums.size()-k+1;
        vector<int>res;
        int l=0;int r=k-1;
        while(l<num){
            while(h>t&&nums[que[h-1]]<=nums[r]){
                h--;
            }
            que[h]=r;
            h++;
            res.push_back(nums[que[t]]);
            if(que[t]==l){
                t++;
            }
            l++;
            r++;
        }
        return res;
    }
};

2.(力扣104)这个题目是求二叉树最大深度,可以将其传化为求最大高度,进而可以转化为使用后序遍历来解决

class Solution {
public:

    int getdep(TreeNode* node){
        if(node==NULL){
            return 0;
        }

        int l=getdep(node->left);
        int r=getdep(node->right);
        return  1+max(l,r);       
    }

    int maxDepth(TreeNode* root) {
        int res=getdep(root);
        return res;
    }
};

3.(力扣111)这是一道求二叉树最小深度的问题,其实求深度一个使用前序遍历,但其实可以将问题转化为求最小高度,进而可以用后序遍历。并不能将其简单的以为是求最大深度里将取最大变成取最小,因为这样会将左(右)子树整个为空的情况错误处理,所以在它前面应应该加上判断

class Solution {
public:

    int getdepth(TreeNode* node){
        if(node==NULL){
            return 0;
        }
        int l=getdepth(node->left);
        int r=getdepth(node->right);
        if(node->left==NULL&&node->right!=NULL){
            return r+1;
        }else if(node->left!=NULL&&node->right==NULL){
            return l+1;
        }
        return min(l,r)+1;
    }

    int minDepth(TreeNode* root) {
        int res=getdepth(root);
        return res;
    }
};

你可能感兴趣的:(算法刷题,算法,leetcode,数据结构)