Leetcode-904+992-水果成篮+k个不同整数的子数组

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)

猜你喜欢

转载自blog.csdn.net/qq_42883222/article/details/113781390
今日推荐