classSolution { public: intmaxVowels(string s, int k){ unordered_set<char> vowels = {'a','e','i','o','u'}; int n = s.size(); int res = 0; for(int i=0;i<n-k+1;i++){ int ans = 0; for(int j=i;j<i+k;j++){ if(vowels.count(s[j])) ans++; } res = max(res,ans); } return res; } };
采用了暴力枚举所有子串的方法,时间复杂度是O(nk)
在过样例时卡在了第103个,是一个n和k均非常大的样例,导致直接爆了
改进code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { public: intmaxVowels(string s, int k){ unordered_set<char> vowels = {'a','e','i','o','u'}; int n = s.size(); int res = 0; for(int i=0;i<k;i++){ if(vowels.count(s[i])) res ++; } int ans = res; for(int i=0;i<n-k+1;i++){ if(vowels.count(s[i])) ans--; if(vowels.count(s[i+k])) ans++; res = max(res,ans); } return res; } };
过了,但是耗时还是挺高的
643.子数组最大平均数 I
给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。
请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。
任何误差小于 10-5 的答案都将被视为正确答案
mycode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { public: doublefindMaxAverage(vector<int>& nums, int k){ double res = 0; for(int i=0;i<k;i++){ res += nums[i]; } double ans = res/k; for(int i=0;i<nums.size()-k;i++){ res -= nums[i]; res += nums[i+k]; ans = max(ans,res/k); } return ans; } };
跟上一题差不多
1343.大小为 K 且平均值大于等于阈值的子数组数目
给你一个整数数组 arr 和两个整数 k 和 threshold 。
请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。
mycode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { public: intnumOfSubarrays(vector<int>& arr, int k, int threshold){ int count = 0; int sum = 0; for(int i=0;i<k;i++){ sum += arr[i]; } if(sum >= threshold*k) count ++; for(int i=0;i<arr.size()-k;i++){ sum += arr[i+k]; sum -= arr[i]; if(sum >= threshold*k) count ++; } return count; } };
2090.半径为 k 的子数组平均值
给你一个下标从 0 开始的数组 nums ,数组中有 n 个整数,另给你一个整数 k 。
半径为 k 的子数组平均值 是指:nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值,即下标在 i - k 和 i + k 范围(含i - k 和 i + k)内所有元素的平均值。如果在下标 i 前或后不足 k 个元素,那么 半径为 k 的子数组平均值 是 -1 。
构建并返回一个长度为 n 的数组 avgs ,其中 avgs[i] 是以下标 i 为中心的子数组的 半径为 k 的子数组平均值 。
x 个元素的 平均值 是 x 个元素相加之和除以 x ,此时使用截断式 整数除法 ,即需要去掉结果的小数部分。
classSolution { public: longlongmaxSum(vector<int>& nums, int m, int k){ longlong maxsum = 0,sum = 0; int n = nums.size(); unordered_map<int,int> cnt; for(int i=0;i<n;i++){ cnt[nums[i]]++; sum += nums[i]; if(i<k-1) continue;
int left = i-k+1; if(cnt.size()>=m) maxsum = max(maxsum,sum); sum -= nums[left]; if(cnt[nums[left]] == 1) cnt.erase(nums[left]); else cnt[nums[left]]--; } return maxsum; } };
2461.长度为 K 子数组中的最大和
给你一个整数数组 nums 和一个整数 k 。请你从 nums 中满足下述条件的全部子数组中找出最大子数组和:
classSolution { public: intmaxScore(vector<int>& cardPoints, int k){ longlong maxsum = 0 , sum = 0 , total = 0; int n = cardPoints.size(); for(int i=0;i<n;i++) total += cardPoints[i]; if(n==k) return total; for(int i=0;i<n;i++){ sum += cardPoints[i]; int left = i-(n-k)+1; if(left < 0) continue;
maxsum = max(maxsum,total-sum); sum -= cardPoints[left];
} return maxsum; } };
改进
total的求和部分用reduce
1
total = reduce(cardPoints.begin(),cardPoints.end())
发现,时间复杂度下去了
1052.爱生气的书店老板
有一个书店老板,他的书店开了 n 分钟。每分钟都有一些顾客进入这家商店。给定一个长度为 n 的整数数组 customers ,其中 customers[i] 是在第 i 分钟开始时进入商店的顾客数量,所有这些顾客在第 i 分钟结束后离开。
在某些分钟内,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。