904
题目描述
理解题目的意思其实是:
我们要在指定的数组里面,找到包含有两个不同整数的最大子数组
思路 滑动窗口
同样采用经典做法:
- 不断探索窗口右边界直到到达数组边界
- 当右边界遇到特殊情况时,改变左边界使得满足要求
- 每次更新解
具体思路就不写了,不难
class Solution {
public:
int totalFruit(vector<int>& tree) {
int left = 0, right = 0, res = 0;
int len = tree.size();
unordered_map<int, int> m;
int target = 0;
while(right < len) {
if(m[tree[right]] == 0) {
target++;
}
m[tree[right]]++;
while(target > 2) {
m[tree[left]]--;
if(m[tree[left]] == 0) {
target--;
m.erase(tree[left]);
}
left++;
}
res = max(res, right - left + 1);
right++;
}
return res;
}
};
时间复杂O(n)
空间复杂度O(n)
992
题目描述
思路
大佬清晰无比的思路
难题就难在思路想不出来,这里看了大佬的思路以后代码实现并不难。
思路:A中由最多 K 个不同整数组成的子数组的个数 - A中由最多 K - 1个不同整数组成的子数组的个数就是题目的解答。
那么就转换为求解最多 n 个不同整数组成的子数组的个数
这里只要把904的代码其中一句话修改就可以了
res = max(res, right - left + 1);
改为
res += right - left + 1;
当我们寻找一个新的右边界元素,得到一个新的子数组时,由它而新增的子数组的个数就是right - left + 1个
大佬已经弄好动图了,大家自行去看就懂了。(要写实在太多了)
直接上代码
class Solution {
public:
//最终结果为A中由最多 K 个不同整数组成的子数组的个数
//减去A中由最多 K - 1个不同整数组成的子数组的个数
int subarraysWithKDistinct(vector<int>& A, int K) {
return maxSubarrayCount(A, K) - maxSubarrayCount(A, K - 1);
}
//A中由最多 K 个不同整数组成的子数组的个数
int maxSubarrayCount(vector<int> A, int k) {
unordered_map<int, int> m;
int left = 0, right = 0;
int len = A.size();
int target = 0;
int res = 0;
while(right < len) {
if(m[A[right]] == 0) {
target++;
}
m[A[right]]++;
while(target > k) {
m[A[left]]--;
if(m[A[left]] == 0) {
target--;
}
left ++;
}
res += right - left + 1;
right++;
}
return res;
}
};
空间复杂度O(n)
时间复杂度O(n)