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;
}
};