leetcode周赛235
作者:互联网
1.水题
class Solution {
public:
string truncateSentence(string s, int k) {
string t="";
if(k==0)
return "";
else
{
int i=0;
int cnt=0;
while(i<s.length()&&cnt<k)
{
if(s[i]==' ')
{
cnt++;
}
if(cnt<k)
{
t+=s[i];
}
i++;
}
}
return t;
}
};
2.主要是hash的用法,用map套set,语法上如何处理
class Solution {
public:
vector<int> findingUsersActiveMinutes(vector<vector<int>>& logs, int k) {
unordered_map<int,unordered_set<int> > hash;//unordered_set无序去重
for(int i=0;i<logs.size();i++)
{
hash[logs[i][0]].insert(logs[i][1]);
}
vector<int> a(k);//初始化vector的操作别忘了
for(auto& i:hash)
{
a[i.second.size()-1]++;//下标从1开始的处理
}
return a;
}
};
3 首先找出和nums2数组中每个数最接近的nums1中的数。把nums1排序二分查找,这样不会超时。注意二分查找后,最接近的数可能是我们当前查找到的数也可能是上一个数。
再算出原本nums1和nums2的距离ans。在每个nums1中的数替换后,都有一个abs(numscopy[t]-nums2[i]),找到其中的最大值,用ans=res-maxx得到答案。
需要注意的是,如果替换后效果更差,即ans<0了,就选择不替换。
class Solution {
public:
int minAbsoluteSumDiff(vector<int>& nums1, vector<int>& nums2) {
vector<int> numscopy=nums1;
vector<long long> a(nums2.size()+1);
sort(numscopy.begin(),numscopy.end());
int mod=1e9+7;
for(int i=0;i<nums2.size();i++)
{
int t;
if(nums2[i]>numscopy[0]&&nums2[i]<numscopy[numscopy.size()-1])
{
t=lower_bound(numscopy.begin(),numscopy.end(),nums2[i])-numscopy.begin();
int s=t-1;
if(abs(numscopy[s]-nums2[i])>=abs(numscopy[t]-nums2[i]))
{
a[i]=(long long)abs(numscopy[t]-nums2[i]);
}
else
{
a[i]=(long long)abs(numscopy[s]-nums2[i]);
}
}
else if(nums2[i]>numscopy[0])
{
t=numscopy.size()-1;
a[i]=(long long)abs(numscopy[t]-nums2[i]);
}
else
{
t=0;
a[i]=(long long)abs(numscopy[t]-nums2[i]);
}
}
long long maxx=0;
for(int i=0;i<nums1.size();i++)
{
long long temp=(long long)abs(nums1[i]-nums2[i]);
maxx=max(maxx,(long long)abs(a[i]-temp));
}
long long ans=0;
for(int i=0;i<nums1.size();i++)
{
ans=ans+(long long)abs(nums1[i]-nums2[i]);
}
long long res=(ans-maxx)%mod;
if(ans>0)
return (int)res;
else
return (int)ans;
}
};
4.一道好题。题目要求找到子序列中最小公倍数的数目。
- 枚举子序列会超时,于是想到枚举可能的最大公约数。
- 一个数是数组里数的约数,他就可能是最大公约数。一个数是最大公约数,当且仅当他在数组中所有的倍数的最大公约数是他自己。
- 运用素数筛法类似的做法,填写出数组gcdd,表示每个数在数组里的倍数的最大公约数。如果是自己,就说明他是子序列的一个最大公约数。
- 这个性质确实不好想,要多锻炼思维。
class Solution {
public:
int countDifferentSubsequenceGCDs(vector<int>& nums) {
int t;
vector<int> gcdd(200001);
for(auto x:nums)
{
for(int i=1;i*i<=x;i++)
{
if(x%i==0)
{
if(!gcdd[i])
{
gcdd[i]=x;
}
else
{
gcdd[i]=gcd(x,gcdd[i]);
}
if(i*i!=x)
{
if(!gcdd[x/i])
{
gcdd[x/i]=x;
}
else
{
gcdd[x/i]=gcd(x,gcdd[x/i]);
}
}
}
}
}
unordered_set<int> ans;
for(int i=1;i<gcdd.size();i++)
{
if(gcdd[i]==i)
{
ans.insert(gcdd[i]);
}
}
return ans.size();
}
};
标签:周赛,int,long,gcdd,ans,numscopy,235,leetcode,nums2 来源: https://blog.csdn.net/jcjbusbjk/article/details/115550892