@@ -6,11 +6,11 @@ Tag : 「双指针」、「滑动窗口」
66
77
88
9- 给定一个正整数数组 A ,如果 A 的某个子数组中不同整数的个数恰好为 K ,则称 A 的这个连续、不一定不同的子数组为好子数组。
9+ 给定一个正整数数组 $A$ ,如果 $A$ 的某个子数组中不同整数的个数恰好为 $K$ ,则称 $A$ 的这个连续、不一定不同的子数组为好子数组。
1010
11- ( 例如,[ 1,2,3,1,2] 中有 3 个不同的整数:1,2 ,以及 3。)
11+ 例如,$ [ 1,2,3,1,2] $ 中有 3ドル$ 个不同的整数:1ドル,ドル2ドル$ ,以及 3ドル$。
1212
13- 返回 A 中好子数组的数目。
13+ 返回 $A$ 中好子数组的数目。
1414
1515示例 1:
1616```
@@ -27,31 +27,30 @@ Tag : 「双指针」、「滑动窗口」
2727
2828
2929提示:
30- * 1 <= A.length <= 20000
31- * 1 <= A[ i] <= A.length
32- * 1 <= K <= A.length
30+ * $ 1 <= A.length <= 20000$
31+ * $ 1 <= A[ i] <= A.length$
32+ * $ 1 <= K <= A.length$
3333
3434---
3535
3636### 滑动窗口
3737
38- 对原数组 ` nums ` 的每一个位置 ` i ` 而言:
38+ 对原数组每个 $ nums[ i ] $ 而言:
3939
40- 1 . 找到其左边「最远」满足出现 ` k ` 个不同字符的下标,记为 ` p ` 。这时候形成的区间为 ` [p, i] `
41- 2 . 找到其左边「最远」满足出现 ` k - 1 ` 个不同字符的下标,记为 ` j ` 。这时候形成的区间为 ` [j, i] `
42- 3 . ** 那么对于 ` j - p ` 其实就是代表以 nums[ i] 为右边界(必须包含 num[ i] ),不同字符数量「恰好」为 k 的子数组数量**
40+ 1 . 找到其左边「最远」满足出现 $k$ 个不同字符的下标,记为 $p$ 。这时候形成的区间为 $ [ p, i] $
41+ 2 . 找到其左边「最远」满足出现 $ k - 1$ 个不同字符的下标,记为 $j$ 。这时候形成的区间为 $ [ j, i] $
42+ 3 . ** 那么对于 $ j - p$ 其实就是代表以 $ nums[ i] $ 为右边界(必须包含 $ num[ i] $ ),不同字符数量「恰好」为 $k$ 的子数组数量**
4343
4444![ WechatIMG1758.png] ( https://pic.leetcode-cn.com/1612839352-exScZN-WechatIMG1758.png )
4545
46- 我们使用 ` lower ` 数组存起每个位置的 ` k ` ;使用 ` upper ` 数组存起每个位置的 ` j ` 。
46+ 我们使用 $ lower$ 数组存起每个位置的 $k$ ;使用 $ upper$ 数组存起每个位置的 $j$ 。
4747
48- 累积每个位置的 ` upper[i] - lower[i] ` 就是答案。
48+ 累积每个位置的 $ upper[ i] - lower[ i] $ 就是答案。
4949
50- 计算 ` lower ` 数组 和 ` upper ` 数组的过程可以使用双指针。
50+ 计算 $ lower$ 数组 和 $ upper$ 数组的过程可以使用双指针。
5151
5252代码:
53- 54- ``` java
53+ ``` Java
5554class Solution {
5655 public int subarraysWithKDistinct (int [] nums , int k ) {
5756 int n = nums. length;
@@ -82,19 +81,19 @@ class Solution {
8281* 时间复杂度:对数组进行常数次扫描。复杂度为 $O(n)$。
8382* 空间复杂度:$O(n)$
8483
85- ***
84+ ---
8685
8786### 其他
8887
89- 这里的 ` lower ` 和 ` upper ` 其实可以优化掉,但也只是常数级别的优化,空间复杂度仍为 $O(n)$。
88+ 这里的 $ lower$ 和 $ upper$ 其实可以优化掉,但也只是常数级别的优化,空间复杂度仍为 $O(n)$。
9089
91- 推荐大家打印一下 ` lower ` 和 ` upper ` 来看看,加深对 ** 「 ` upper[i] - lower[i] ` 代表了考虑 ` nums[i] ` 为右边界,不同字符数量「恰好」为 k 的子数组数量 」** 这句话的理解。
90+ 推荐大家打印一下 $ lower$ 和 $ upper$ 来看看,加深对 ** 「 $ upper[ i] - lower[ i] $ 代表了考虑 $ nums[ i] $ 为右边界,不同字符数量「恰好」为 $k$ 的子数组数量 」** 这句话的理解。
9291
9392---
9493
9594### 最后
9695
97- 这是我们「刷穿 LeetCode」系列文章的第 ` No.992 ` 篇,系列开始于 2021年01月01日,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先将所有不带锁的题目刷完 。
96+ 这是我们「刷穿 LeetCode」系列文章的第 ` No.992 ` 篇,系列开始于 2021年01月01日,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完 。
9897
9998在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
10099
0 commit comments