5722.截断句子
对python来说太方便了。
class Solution:
def truncateSentence(self, s: str, k: int) -> str:
return " ".join(s.split()[:k])
5723.查找用户活跃分钟数
当时写的时候觉得map里嵌套一个set可能无法实现,但是看了别人的代码发现是可以的,我这个写法可能有点麻烦。
不过还好没超时,相当于线性查找最小值,如果用set的话插入过程中应该是logn
class Solution {
public:
vector<int> findingUsersActiveMinutes(vector<vector<int>>& logs, int k) {
int n=logs.size();
vector<int>res(k,0);
map<int,vector<int>>mp;
map<int,int>mp1;
for(int i=0;i<n;i++){
mp[logs[i][0]].push_back(logs[i][1]);
}
for(auto c : mp)
{
int t=INT_MAX;
for(int i=0;i<c.second.size();i++){
mp1[c.second[i]]++;
}
res[mp1.size()-1]++;
mp1.clear();
}
return res;
}
};
5724.绝对差值和
这个题看评论区很多人写的O(n)的贪心:找到影响绝对值最大的进行替换。
但是这个贪心是不正确的,但是测试数据太水都过了,不知道这次会使rejudge还是unrated。
正确的做法应该是O(NlogN),首先求出原数组的绝对差值和,然后再次遍历,利用二分查找,找到nums1中最接近nums2[i]的数,然后求得绝对值差,然后从原来的和中减去原有的和加上这个,然后每次取最小值。
注意好边界问题
class Solution {
public:
const int MOD=1e9+7;
int minAbsoluteSumDiff(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size();
long long res=0;
for(int i=0;i<n;i++){
res+=abs(nums1[i]-nums2[i]);
}
long long sum=res;
vector<int>a=nums1;
sort(a.begin(),a.end());
for(int i=0;i<n;i++)
{
int t=n-1;
if(lower_bound(a.begin(),a.end(),nums2[i])!=a.end()){
t=lower_bound(a.begin(),a.end(),nums2[i])-a.begin();
}
int num1=a[t];
if(t>0){
int num2=a[t-1];
int cha1=abs(num1-nums2[i]);
int cha2=abs(num2-nums2[i]);
res=min(res,min(sum-abs(nums1[i]-nums2[i])+cha1,sum-abs(nums1[i]-nums2[i])+cha2));
}
else{
int cha1=abs(num1-nums2[i]);
res=min(res,sum-abs(nums1[i]-nums2[i])+cha1);
cout<<res<<endl;
}
}
return res%MOD;
}
};
5725.序列中不同最大公约数的数目
换个思路,最大公约数一定小于这些数,所以我们可以枚举从1到最大值,这些数都可能成为序列中的最大公约数,那么如果一个数的最大公约数是x,那么它一定是x的倍数,所以遍历x的倍数,如果这个数存在于数组中,那么就求最大公约数,如果最大公约数等于x,那么就符合条件,res+1
class Solution {
public:
int countDifferentSubsequenceGCDs(vector<int>& nums) {
int n=nums.size();
vector<bool>check(2e5+1);
int mmx=0;
for(int i=0;i<n;i++)
{
mmx=max(nums[i],mmx);
check[nums[i]]=true;
}
int res=0;
for(int i=1;i<=mmx;i++)
{
int sum=0;
for(int j=i;j<=mmx;j+=i){
if(check[j]){
if(sum==0) sum=j;
else sum=__gcd(sum,j);
if(sum==i){
res++;
break;
}
}
}
}
return res;
}
};