目录
6284. 使字符串总不同字符的数目相等 - 哈希表+暴力枚举
6285. 执行 K 次操作后的最大分数 - 优先队列
1、tle
class Solution {
public:
long long maxKelements(vector<int>& nums, int k) {
long long res=0;
int n=nums.size();
sort(nums.begin(),nums.end());
while(k--)
{
res+=nums[n-1];
long long x;
if(nums[n-1]%3==0) x=nums[n-1]/3;
else x=nums[n-1]/3+1;
nums[n-1]=x;
sort(nums.begin(),nums.end());
}
return res;
}
};
2、优先队列
class Solution {
public:
long long maxKelements(vector<int>& nums, int k) {
long long res=0;
priority_queue <long long> q;
for(auto x:nums) q.push(x);
while(k--)
{
auto x=q.top();
res+=x;
q.pop();
q.push(ceil(1.0*x/3));
}
return res;
}
};
6284. 使字符串总不同字符的数目相等 - 哈希表+暴力枚举
给定两个字符串,交换其中两字符串中的一个字母,使得两个字符串中不同字符的数目相等
- 需要交换的只有26个字母
- 必须交换一次且位置随意
我们只需要枚举两个字符串中的各个字母之间调换情况进行判断 O(26*26)
哈希表存的是每个字符出现的次数 map[char]=cnt
枚举w1的字符c1和w2的字符c2,设word1字符总数为len1,word2字符总数为len2
- 如果c1==c2,当len1==len2时,则return true
- 如果c1!=c2,且len1+(w1中是否存在c2)-(c1的个数是否为1)==len2+(w2中是否存在c1)-(c2的个数是否为1),说明交换c1和c2,可以使两字符串的字符种类数相同
详解:
- 如果w中不存在要交换过来的c,则字符种类数len要+1
- 如果w中要交换出去的c个数只剩1个,则字符种类数len要-1
- 如果经过交换,len1==len2,则return true
1、详细解法
class Solution {
public:
bool isItPossible(string word1, string word2) {
unordered_map<char,int> mp1,mp2;
for(char x:word1) mp1[x]++;
for(char x:word2) mp2[x]++;
//len1,len2表示w1 w2中不同字符的总数
//n1,n2表示字符串中某字符的数量
//t1 t2表示w1 w2要交换的字符
int len1,len2,n1,n2;
char t1,t2;
for(auto &i:mp1)//加& 对m1的修改可以影响mp1
{
t1=i.first,n1=i.second;
for(auto &j:mp2)
{
t2=j.first,n2=j.second;
len1=mp1.size(),len2=mp2.size();
//如果要交换的字符相同
if(t1==t2)
{
if(len1==len2) return true; //且 w1 w2字符种类相同时
continue;
}
//如果交换字符不同
//如果w1中不存在t2 将t2交换过来则字符种类数+1 w2同理
if(!mp1.count(t2)) len1++;
if(!mp2.count(t1)) len2++;
//w1中如果被交换的字符只剩1个 则字符数-1 w2同理
if(n1==1) len1--;
if(n2==1) len2--;
//如果交换完t1 t2 总字符数相等 说明一次交换后可以成功
if(len1==len2) return true;
}
}
return false;
}
};
2、简洁解法
class Solution {
public:
bool isItPossible(string word1, string word2) {
unordered_map<char,int> mp1,mp2;
for(char x:word1) mp1[x]++;
for(char x:word2) mp2[x]++;
for(auto &[c1,n1]:mp1)//加& 对c1 n1的修改可以影响mp1
for(auto &[c2,n2]:mp2)
{
if(c1==c2)
{
if(mp1.size()==mp2.size()) return true;
}
else
{
if(mp1.size()-(n1==1)+(mp1.count(c2)==0)==mp2.size()-(n2==1)+(mp2.count(c1)==0))
return true;
}
}
return false;
}
};