Leetcode 题集

字典树(链表版)

class Trie {
    
    
public:
    /** Initialize your data structure here. */
    bool ed;
    Trie* next[26];
    Trie() {
    
    
        memset(next,0,sizeof next);
        ed=0;
    }
    
    /** Inserts a word into the trie. */
    void insert(string word) {
    
    
        Trie* rt=this;
        for(char v:word){
    
    
            if(!rt->next[v-'a'])rt->next[v-'a']=new Trie();
            rt=rt->next[v-'a'];
        }
        rt->ed=1;
    }
    
    /** Returns if the word is in the trie. */
    bool search(string word) {
    
    
        Trie* rt=this;
        for(char v:word){
    
    
            if(!rt->next[v-'a'])return 0;
            rt=rt->next[v-'a'];
        }
        return rt->ed==1;
    }
    
    /** Returns if there is any word in the trie that starts with the given prefix. */
    bool startsWith(string prefix) {
    
    
        Trie* rt=this;
        for(char v:prefix){
    
    
            if(!rt->next[v-'a'])return 0;
            rt=rt->next[v-'a'];
        }
        return 1;
    }
};

1-n的排列字典序第k大

typedef long long ll;
class Solution {
    
    
public:
    int get(ll c1,ll c2,ll n){
    
    
        int ans=0;
        while(c1<=n){
    
    
            ans=ans+min(c2,n+1)-c1;
            c1*=10,c2*=10;
        }
        return ans;
    }
    int findKthNumber(int n, int k) {
    
    
        int cur=1;
        k--;
        int ans=0;
        while(k){
    
    
            int num=get(cur,cur+1,n);
            if(num<=k){
    
    
                cur++;
                k-=num;
            }
            else{
    
    
                k--;
                cur*=10;
            }
        }
        return cur;
    }
};

康托展开求全排列第k个

参考:


class Solution {
    
    
public:
    int c[10];
    void upd(int x,int v){
    
    
        for(int i=x;i<10;i+=(i&(-i)))c[i]+=v;
    }
    int ask(int x){
    
    
        int ans=0;
        for(int i=x;i;i-=(i&(-i)))ans=ans+c[i];
        return ans;
    }
    int query(int k,int n){
    
    
        int l=1,r=n,ans=l;
        while(l<=r){
    
    
            int mid=(l+r)/2;
            if(ask(mid)>=k)r=mid-1,ans=mid;
            else l=mid+1;
        }
        return ans;
    }
    string getPermutation(int n, int k) {
    
    
        vector<int>fac(n+1,0),vis(n+1,0);
        fac[0]=1;
        for(int i=1;i<=n;i++)fac[i]=fac[i-1]*i,upd(i,1);
        string ans;
        k--;
        for(int i=n-1;i>=0;i--){
    
    
            int x=(k/fac[i])+1;
            x=query(x,n);
            upd(x,-1);
            ans=ans+char(x+'0');
            k=k%fac[i];
        }
        return ans;
    }
};

正则表达式匹配

class Solution {
    
    
public:
    bool ismatch(int i,int j,string &s,string &p){
    
    
        if(p[j-1]=='.')return 1;
        return s[i-1]==p[j-1];
    }
    bool isMatch(string s, string p) {
    
    
        int n=s.size(),m=p.size();
        vector<vector<int> >dp(n+1,vector<int>(m+1,0));
        dp[0][0]=1;
        for(int i=0;i<=n;i++){
    
    
            for(int j=1;j<=m;j++){
    
    
                if(p[j-1]=='*'){
    
    
                    if(j>=2)dp[i][j]|=dp[i][j-2];
                    if(i>=1&&ismatch(i,j-1,s,p))dp[i][j]|=dp[i-1][j];
                }
                else{
    
    
                    if(i>=1&&ismatch(i,j,s,p))dp[i][j]|=dp[i-1][j-1];
                }
            }
        }
        return dp[n][m];

    }
};

通配符匹配

class Solution {
    
    
public:
    bool isok(string &s,string &p,int i,int j) {
    
    
        if(p[j-1]=='?'||s[i-1]==p[j-1])return 1;
        return 0;
    }
    bool isMatch(string s, string p) {
    
    
        int n=s.size(),m=p.size();
        vector<vector<int> >dp(n+1,vector<int>(m+1,0));
        dp[0][0]=1;
        int j=0;
        while(j<m&&p[j]=='*')dp[0][j+1]=1,j++;
        for(int i=1;i<=n;i++){
    
    
            for(int j=1;j<=m;j++){
    
    
                if(p[j-1]=='*'){
    
    
                    dp[i][j]|=dp[i][j-1];
                    dp[i][j]|=dp[i-1][j];
                }
                else{
    
    
                    if(isok(s,p,i,j))dp[i][j]|=dp[i-1][j-1];
                }
            }
        }
        return dp[n][m];

    }
};

数据流中位数

class bigheap {
    
    
public:
    vector<int>a;
    int sz=0;
    void push(int x) {
    
    
        ++sz;
        a.push_back(x);
        int cur=sz;
        while(cur>1) {
    
    
            int fa=cur/2;
            if(a[fa]<a[cur]) {
    
    
                swap(a[fa],a[cur]);
            } else break;
            cur=fa;
        }
    }
    int top() {
    
    
        return a[1];
    }
    void pop() {
    
    
        swap(a[1],a[sz--]);
        a.pop_back();
        int cur=1;
        while(cur*2<=sz) {
    
    
            int son=cur*2;
            if(son+1<=sz&&a[son+1]>a[son])son++;
            if(a[cur]<a[son])swap(a[cur],a[son]);
            else break;
            cur=son;
        }
    }
    bigheap() {
    
    
        a.clear();
        a.push_back(-1);
    }
};
class smallheap {
    
    
public:
    vector<int>a;
    int sz=0;
    void push(int x) {
    
    
        ++sz;
        a.push_back(x);
        int cur=sz;
        while(cur>1) {
    
    
            int fa=cur/2;
            if(a[fa]>a[cur]) {
    
    
                swap(a[fa],a[cur]);
            } else break;
            cur=fa;
        }
    }
    int top() {
    
    
        return a[1];
    }
    void pop() {
    
    
        swap(a[1],a[sz--]);
        a.pop_back();
        int cur=1;
        while(cur*2<=sz) {
    
    
            int son=cur*2;
            if(son+1<=sz&&a[son+1]<a[son])son++;
            if(a[cur]>a[son])swap(a[cur],a[son]);
            else break;
            cur=son;
        }
    }
    smallheap() {
    
    
        a.clear();
        a.push_back(-1);
    }
};
class MedianFinder {
    
    
public:
    /** initialize your data structure here. */
    bigheap L;
    smallheap R;
    MedianFinder() {
    
    

    }

    void addNum(int num) {
    
    
        
        if(L.sz==R.sz) {
    
    
            R.push(num);
            int x=R.top();
            R.pop();
            L.push(x);
        } else {
    
    
            L.push(num);
            int x=L.top();
            L.pop();
            R.push(x);
        }
        int x=L.top(),y=R.top();
    }

    double findMedian() {
    
    

        if(L.sz==R.sz) {
    
    
            return 1.0*(L.top()+R.top())/2;
        } else return L.top();

    }
};

# [寻找两个正序数组的中位数](https://leetcode-cn.com/problems/median-of-two-sorted-arrays/)

```cpp
class Solution {
    
    
public:
    int solve(vector<int>&a,int l,int r,vector<int>&b,int ql,int qr,int k){
    
    
        if(l>r)return b[ql+k-1];
        if(ql>qr)return a[l+k-1];
        int mid=(l+r)/2;
        int qmid=(ql+qr)/2;
        int num=mid-l+1+qmid-ql+1;
        if(a[mid]<b[qmid]){
    
    
            if(num>k)return solve(a,l,r,b,ql,qmid-1,k);
            else return solve(a,mid+1,r,b,ql,qr,k-(mid-l+1));
        }
        else{
    
    
            if(num>k)return solve(a,l,mid-1,b,ql,qr,k);
            else return solve(a,l,r,b,qmid+1,qr,k-(qmid-ql+1));
        }
    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    
    
        int n=nums1.size(),m=nums2.size();
        if((n+m)&1)return solve(nums1,0,n-1,nums2,0,m-1,(n+m+1)/2);
        else return 1.0*(solve(nums1,0,n-1,nums2,0,m-1,(n+m+2)/2)+solve(nums1,0,n-1,nums2,0,m-1,(n+m)/2))/2;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43653111/article/details/113107291