【问题标题】:Intuition behind calculating values for 'atmost K' and 'atmost K-1' to get the answer for 'equals K'计算“atmost K”和“atmost K-1”值以获得“等于 K”答案的直觉
【发布时间】:2021-09-28 12:16:04
【问题描述】:

我正在尝试解决algorithm problem

给定一个正整数数组nums,如果该子数组中不同整数的数量正好是k,则调用nums 的(连续的,不一定不同的)子数组“好”。例如,[1,2,3,1,2] 具有 3 不同的整数:123。返回nums的好子数组个数。

查看here的解决方案,我想出了以下滑动窗口的方法:

class Solution {
public:
    int helper(vector<int>& nums, int B) {
        unordered_map<int, int> m;

        int start=0, end=0, count=0;
        while(end<nums.size()) {
            m[nums[end]]++;
            while(m.size()>B) {
                m[nums[start]]--;
                if(m[nums[start]]<=0) m.erase(nums[start]);
                start++;
            }
            count+=(end-start+1);
            end++;
        }
        return count;
    }
    
    int subarraysWithKDistinct(vector<int>& nums, int k) {
        return helper(nums, k)-helper(nums, k-1);
    }
};

我了解 helper() 函数的工作原理,但不了解使用 atmost kk-1 不同整数计算子数组数量并减去它们背后的直觉(即,在helper(nums, k)-helper(nums, k-1) 后面)获取具有完全等于k 个不同整数的子数组的数量。

我缺少什么理解?

【问题讨论】:

  • found 最接近的事情是声明:“一般来说,滑动窗口问题有某种聚合,最多 k,最大子串,最小子串与 k 等。他们总是“给定一个数组或字符串,找到一些计算的子问题“值。”

标签: c++ algorithm sliding-window sub-array


【解决方案1】:

我了解 helper() 函数的工作原理,但不了解计算最多 k 和 k-1 个不同整数的子数组数量并减去它们背后的直觉(即,在 helper(nums, k)-helper(nums, k -1)) 得到完全等于 k ​​个不同整数的子数组的数量。

好吧,假设你有一个房间,里面有一群孩子。原来五岁以下的孩子有12个,四岁以下的有8个。

现在想必你同意“四岁以下儿童”中的每一个也是“五岁以下儿童”中的一个吧?

因此,假设我们将 12 个 5 岁或以下的孩子从他们身上移走 8 个 4 岁或以下的孩子。当然,还有 12 - 8 = 4 个孩子。

现在,这些孩子分别多大了?

【讨论】:

  • 哦,我明白了那个;我不明白这样做背后的需要/直觉。为什么我们不能直接找到 完全等于 k 个不同整数的结果?
  • 嗯,这样做的原因是因为您发现用 最多 k 个不同元素计算子集的方法比用 计算子集便宜得多正好 k个元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2015-05-09
相关资源
最近更新 更多