leetcode 第 221 场周赛

5637. 判断字符串的两半是否相似

题意

如果字符串的两半相似,则两半拥有的元音字母个数应该相同

class Solution {
public:
    int count(string s){
        int res=0;
        set<char>S({'a','e','i','o','u'});
        for(auto c:s){
            auto x = tolower(c);
            if(S.count(x)){
                res++;
            }
        }
        return res;
    }
    bool halvesAreAlike(string s) {
        int n=s.length()/2;
        return count(s.substr(0,n))==count(s.substr(n));
    }
};

5638. 吃苹果的最大数目

题意

一颗苹果树,每天都可以长出若干苹果,每天长出的苹果保质期不同,每天最多只能吃一个苹果,求最多可以吃到的苹果数量

思路

优先吃保质期最短的苹果,用小根堆进行维护


class Solution {
public:
    typedef pair<int,int> pii;
    int eatenApples(vector<int>& a, vector<int>& d) {
        int n=a.size();
        priority_queue<pii,vector<pii>,greater<pii>>q;//小根堆
        q.push({d[0],a[0]});
        int i=0,ans=0;
        while(!q.empty() || i<n){
            while(!q.empty()&&(q.top().first<=i || q.top().second<=0)) q.pop(); //将已经坏掉的苹果淘汰
            if(!q.empty()){
                pii p=q.top();
                q.pop();
                ans++;
                p.second--;
                if(p.second>0) q.push(p);//如果还有可以吃的苹果,加入堆
            }
            i++;
            if(i<n) q.push({i+d[i],a[i]});
        }
        return ans;
    }
};

5210. 球会落何处

题意

一个n*m的网格,向网格中都放置一个隔板,值为1的为主对角线隔板,为-1的是副对角线隔板,在第0行的每一列都放置一个小球,若小球能从最后一行出来输出列值,不能则输出-1

思路

先排除不能下来的情况,剩下的深搜即可

class Solution {
public:
    int n,m;
    int dfs(vector<vector<int>>&g,int x,int y){
        if(y==0&&g[x][y]==-1) return -1;
        if(y==n-1&&g[x][y]==1) return -1;
        if(g[x][y]==1&&g[x][y+1]==-1) return -1;
        if(g[x][y]==-1&&g[x][y-1]==1) return -1;
        g[x][y]==1?y=y+1:y=y-1;
        if(x==m-1) return y;
        return dfs(g,x+1,y);
    }
    vector<int> findBall(vector<vector<int>>& grid) {
        m=grid.size();
        n=grid[0].size();
        vector<int>ans;
        for(int i=0;i<n;i++){
            ans.push_back(dfs(grid,0,i));
        }
        return ans;
    }
};

5640. 与数组中元素的最大异或值

题意

有一个nums数组,有q组询问,每组询问包括两个值,一个为x,一个为m,求nums数组中不大于m的元素和x异或的最大值

思路

有点乱,待更新

struct node{
    int x,m,k;//k表示索引
    bool operator < (const node& t) const{
        return m<t.m;
    }
}q[100010];
int son[3100000][2];

class Solution {
public:
    int idx=0;
    void insert(int x){  //插入
        int p=0;
        for(int i=30;i>=0;i--){
            int u=x>>i&1;
            if(!son[p][u]) son[p][u]=++idx;
            p=son[p][u];
        }
    }
    int search(int x){  //查找
        if(!idx) return -1;
        int p=0,res=0;
        for(int i=30;i>=0;i--){
            int u= !(x>>i&1);
            if(son[p][u]) p=son[p][u],res=res*2+1;
            else p=son[p][!u],res=res*2;
        }
        return res;
    }
    vector<int> maximizeXor(vector<int>& nums, vector<vector<int>>& queries) {
        idx=0;
        memset(son,0,sizeof(son));
        int n=nums.size(),m=queries.size();
        for(int i=0;i<m;i++){
            q[i]={queries[i][0],queries[i][1],i};
        }
        sort(nums.begin(),nums.end());
        sort(q,q+m);
        vector<int>res(m);
        for(int i=0,j=0;j<m;j++){
            while(i<n&&nums[i]<=q[j].m) insert(nums[i++]);
            res[q[j].k]=search(q[j].x);
        }
        return res;
    }
};

posted @ 2020-12-27 17:53  voids5  阅读(43)  评论(0编辑  收藏  举报