美文网首页
leetcode周赛

leetcode周赛

作者: 恰似一碗咸鱼粥 | 来源:发表于2019-03-31 12:19 被阅读0次

    第一周

    1029 可被五整除的二进制前缀

    每次循环将前缀乘以二即可
    题型:数学

    class Solution {
    public:
        vector<bool> prefixesDivBy5(vector<int>& A) {
            vector<bool> ans(A.size(),false);
            int pre=0;
            for(int i=0;i<A.size();++i){
                pre=pre*2+A[i];
                pre%=10;
                if(pre%5==0)ans[i]=true;
            }
            return ans;
        }
    };
    

    1030 链表中的下一个最大节点

    要求O(n)解决,搜了一下才知道单调栈....,如果下一个数小于栈顶的数,将这个数入栈,否则将前面的全部pop。
    题型:单调栈

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> nextLargerNodes(ListNode* head) {
            vector<int> save;
            stack<int> s;
            ListNode* Node=head;
            while(Node!=NULL){
                save.push_back(Node->val);
                Node=Node->next;
            }
            vector<int> ans(save.size(),0);
            s.push(0);
            for(int i=1;i<save.size();++i){
                while(!s.empty()&&save[i]>save[s.top()]){
                    ans[s.top()]=save[i];
                    s.pop();
                }
                s.push(i);
            }
            return ans;
        }
    };
    

    1031 飞驰的数量

    dfs解决即可,每次dfs传入一个flag的引用,如果碰到边界,flag置为true。
    题型:搜索

    class Solution {
    public:
        bool vis[500][500];
        int cnt;
        void dfs(int x,int y,bool& flag,vector<vector<int>>& A){
            if(x==0||y==0||x==A.size()-1||y==A[0].size()-1)flag=true;
            for(int i=-1;i<=1;++i){
                for(int j=-1;j<=1;++j){
                    if((i+j==1||i+j==-1)&&x+i>=0&&x+i<A.size()&&y+j>=0&&y+j<A[0].size()){
                        if(A[x+i][y+j]==1&&!vis[x+i][y+j]){
                            vis[x+i][y+j]=true;
                            cnt++;
                            dfs(x+i,y+j,flag,A);
                        }
                    }
                }
            }
        }
        int numEnclaves(vector<vector<int>>& A) {
            int num=0;
            for(int i=0;i<A.size();++i){
                for(int j=0;j<A[0].size();++j){
                    if(A[i][j]==1&&!vis[i][j]){
                        vis[i][j]=true;
                        cnt=1;
                        bool flag=false;
                        dfs(i,j,flag,A);
                        if(!flag)num+=cnt;
                    }
                }
            }
            return num;
        }
    };
    

    第二周

    5016 删除最外层的括号

    用栈即可,当栈为空时不将那个括号加入ans

    class Solution {
    public:
        string removeOuterParentheses(string S) {
            string ans;
            stack<char> st;
            for(int i=0;i<S.size();++i){
                if(S[i]=='('){
                    if(!st.empty())ans+='(';
                    st.push('(');
                }
                else if(S[i]==')'){
                    st.pop();
                    if(!st.empty()){
                        ans+=')';
                    }
                }
            }
            return ans;
        }
    };
    

    5017 从根到叶的二进制数之和

    简单的dfs

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int sum=0;
        void dfs(TreeNode* node,int num){
            if(node->left==NULL&&node->right==NULL){
                sum+=num;
                sum%=1000000007;
                return;
            }
            if(node->left!=NULL)dfs(node->left,(num*2+node->left->val)%1000000007);
            if(node->right!=NULL)dfs(node->right,(num*2+node->right->val)%1000000007);
        }
        
        int sumRootToLeaf(TreeNode* root) {
            dfs(root,root->val);
            return sum;
        }
    };
    

    5018 驼峰式匹配

    双指针。当出现queries大写字母且不匹配时直接返回false。当pattern的指针到达尾部且已经匹配时,若再出现大写字母直接返回false。若某一个字母匹配成功则ptr++

    class Solution {
    public:
        bool ishigh(char x){
            return x>='A'&&x<='Z';
        }
        vector<bool> camelMatch(vector<string>& queries, string pattern) {
            vector<bool> ans(queries.size(),true);
            for(int i=0;i<queries.size();++i){
                int ptr=0;
                bool flag=false;
                for(int j=0;j<queries[i].size();++j){
                    if(ishigh(queries[i][j])&&pattern[ptr]!=queries[i][j]){
                        ans[i]=false;
                        break;
                    }
                    if(queries[i][j]==pattern[ptr]){
                        if(flag&&ishigh(queries[i][j])){
                            ans[i]=false;
                            break;
                        }
                        if(ptr<pattern.size()-1)ptr++;
                        else flag=true;
                    }
                }
                if(!flag)ans[i]=false;
            }
            return ans;
        }
    };
    

    5019 视频拼接

    不会,等答案ing

    相关文章

      网友评论

          本文标题:leetcode周赛

          本文链接:https://www.haomeiwen.com/subject/oxbybqtx.html