Minimum Size Subarray Sum
This commit is contained in:
39
src/s0076_minimum_window_substring.cpp
Normal file
39
src/s0076_minimum_window_substring.cpp
Normal file
@@ -0,0 +1,39 @@
|
||||
#include "s0076_minimum_window_substring.hpp"
|
||||
|
||||
bool Solution::check() {
|
||||
for (const auto &p : ori) {
|
||||
if (cnt[p.first] < p.second) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// 不包含 t 中所有字符,r 右移
|
||||
// 包含 t 中所有字符,l 右移
|
||||
string Solution::minWindow(string s, string t) {
|
||||
for (const auto &c : t) {
|
||||
++ori[c];
|
||||
}
|
||||
|
||||
int l = 0, r = -1;
|
||||
int len = INT_MAX, ansL = -1, ansR = -1;
|
||||
|
||||
while (r < int(s.size())) {
|
||||
if (ori.find(s[++r]) != ori.end()) {
|
||||
++cnt[s[r]];
|
||||
}
|
||||
while (check() && l <= r) {
|
||||
if (r - l + 1 < len) {
|
||||
len = r - l + 1;
|
||||
ansL = l;
|
||||
}
|
||||
if (ori.find(s[l]) != ori.end()) {
|
||||
--cnt[s[l]];
|
||||
}
|
||||
++l;
|
||||
}
|
||||
}
|
||||
|
||||
return ansL == -1 ? string() : s.substr(ansL, len);
|
||||
}
|
||||
32
src/s0209_minimum_size_subarray_sum.cpp
Normal file
32
src/s0209_minimum_size_subarray_sum.cpp
Normal file
@@ -0,0 +1,32 @@
|
||||
#include "s0209_minimum_size_subarray_sum.hpp"
|
||||
|
||||
int Solution::minSubArrayLen(int target, vector<int>& nums) {
|
||||
int len = nums.size();
|
||||
int result{INT_MAX};
|
||||
for (int begin{0}, end{0}, sum{0}; end < len; ++end) {
|
||||
sum += nums[end];
|
||||
// 当滑动窗口里的值的总和大于等于 target 时,移动 begin 直到 sum 比 target
|
||||
// 小
|
||||
if (sum >= target) {
|
||||
while (begin < end && sum >= target) {
|
||||
sum -= nums[begin];
|
||||
++begin;
|
||||
}
|
||||
// 循环结束后有以下几种情况
|
||||
// 1. begin == end && sum >= target 此时 result == 1
|
||||
// 2. begin == end && sum < target 此时 result == 2
|
||||
// 3. begin < end && sum < target 此时 result == end - begin + 2
|
||||
int tmp;
|
||||
if (begin == end) {
|
||||
tmp = sum >= target ? 1 : 2;
|
||||
} else {
|
||||
tmp = end - begin + 2;
|
||||
}
|
||||
// 更新 result
|
||||
result = tmp < result ? tmp : result;
|
||||
}
|
||||
}
|
||||
// 如果 result == INT_MAX 说明 result
|
||||
// 从来没更新过,也就意味着即使所有数组元素加在一起也比 target 小,此时返回 0
|
||||
return result == INT_MAX ? 0 : result;
|
||||
}
|
||||
Reference in New Issue
Block a user