第二十四天
我使用的C++,错误的地方请见谅,文章初衷仅用来督促本人学习,如果恰巧能够给你带来帮助,我会十分开心。
一、438. 找到字符串中所有字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int sLen = s.size(), pLen = p.size();
if (sLen < pLen) {
return vector<int>();
}
vector<int> ans;
vector<int> count(26);
for (int i = 0; i < pLen; ++i) {
++count[s[i] - 'a'];
--count[p[i] - 'a'];
}
int differ = 0;
for (int j = 0; j < 26; ++j) {
if (count[j] != 0) {
++differ;
}
}
if (differ == 0) {
ans.emplace_back(0);
}
for (int i = 0; i < sLen - pLen; ++i) {
if (count[s[i] - 'a'] == 1) {
--differ;
} else if (count[s[i] - 'a'] == 0) {
++differ;
}
--count[s[i] - 'a'];
if (count[s[i + pLen] - 'a'] == -1) {
--differ;
} else if (count[s[i + pLen] - 'a'] == 0) {
++differ;
}
++count[s[i + pLen] - 'a'];
if (differ == 0) {
ans.emplace_back(i + 1);
}
}
return ans;
}
};
这里直接使用两个数组来分别记录两个字符串内字母个数即可,官方解里给出的用differ来记录滑动窗口内两个字符串字母个数差的方法很值得学习.
二、713. 乘积小于K的子数组
给定一个正整数数组 nums和整数 k 。
请找出该数组内乘积小于 k 的连续的子数组的个数。
class Solution {
public:
int numSubarrayProductLessThanK(vector<int>& nums, int k) {
int ans = 0, left = 0, right = 0, val = 1;
if (k <= 1){
return 0;
}
for (right = 0; right < nums.size(); ++right){
val *= nums[right];
while (val >= k){
val /= nums[left];
++left;
}
ans += right - left + 1;
}
return ans;
}
};
还是要先自己手动画着找找规律
三、209. 长度最小的子数组
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-size-subarray-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int ans = INT_MAX, left = 0, right = 0, sum = 0;
if (nums.size() == 0){
return 0;
}
for (right = 0; right < nums.size(); ++right){
sum += nums[right];
while (sum >= target){
ans = min(ans, right - left + 1);
sum -= nums[left];
++left;
}
}
return ans == INT_MAX ? 0 : ans;
}
};
这里和上一道题其实是一样的