438.找到字符串中所有字母异位词class Solution { public: vector<int> findAnagrams(string s, string p) { if (p.length() > s.length()) return {}; vector<int> result; vector<int> hashS(26, 0); vector<int> hashP(26, 0); for (int i = 0; i < p.length(); i++) { hashP[p[i] - 'a']++; } for (int i = 0; i < s.length(); i++) { hashS[s[i] - 'a']++; if (i >= p.length()) { hashS[s[i - p.length()] - 'a']--; } if (hashP == hashS) result.push_back(i - p.length() + 1); } return result; // 61/61 cases passed (12 ms) // Your runtime beats 61.38 % of cpp submissions // Your memory usage beats 95.66 % of cpp submissions (8.3 MB) }}; 713.乘积小于k的子数组class Solution { public: int numSubarrayProductLessThanK(vector<int> &nums, int k) { /*int left = 0, right = 0, rightBefore = 0; int product = nums[left]; int sum = 0; while (1) { if (product >= k || right == nums.size() || left == nums.size()) { sum += ((right - left) + 1) * (right - left) / 2; sum -= ((rightBefore - left) + 1) * (rightBefore - left) / 2; if (product >= k) { product /= nums[left]; left++; rightBefore = right; } if (right == nums.size() || left == nums.size()) { break; } } else { right++; if (right < nums.size()) product *= nums[right]; } } return sum;*/ // 97/97 cases passed (64 ms) // Your runtime beats 70.99 % of cpp submissions // Your memory usage beats 38.52 % of cpp submissions (59.8 MB) if (k == 0 || k == 1) return 0; int l = 0; int prod = 1; //存储nums[l]~nums[r]的累积 int res = 0; for (int r = 0; r < nums.size(); r++) { prod *= nums[r]; while (prod >= k) { prod /= nums[l++]; } res += r - l + 1; //不用rightBefore,因为每次r++都执行了一遍,所以显得简洁 } return res; // 97/97 cases passed (72 ms) // Your runtime beats 36.04 % of cpp submissions // Your memory usage beats 99.36 % of cpp submissions (59.6 MB) //评论区优化过的代码,效率稍高 }}; 209.长度最小的子数组class Solution { public: int minSubArrayLen(int target, vector<int> &nums) { if (nums.empty()) return 0; int left = 0, right = 0; int sum = nums[left]; int minLength = INT_MAX; while (left < nums.size()) { if (sum < target) { if (right >= nums.size() - 1) break; sum += nums[++right]; } else { minLength = min(minLength, min(right, (int)nums.size() - 1) - left + 1); sum -= nums[left++]; } } return minLength == INT_MAX ? 0 : minLength; // 19/19 cases passed (4 ms) // Your runtime beats 94.25 % of cpp submissions // Your memory usage beats 63.79 % of cpp submissions (10.3 MB) }};