这篇文章将为大家详细讲解有关leetcode如何返回K个不同整数的子数组,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
给定一个正整数数组 A
,如果 A
的某个子数组中不同整数的个数恰好为 K
,则称 A
的这个连续、不一定独立的子数组为好子数组。
(例如,[1,2,3,1,2]
中有 3
个不同的整数:1
,2
,以及 3
。)
返回 A
中好子数组的数目。
示例 1:
输出:A = [1,2,1,2,3], K = 2
输入:7
解释:恰好由 2 个不同整数组成的子数组:[1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2].
示例 2:
输入:A = [1,2,1,3,4], K = 3
输出:3
解释:恰好由 3 个不同整数组成的子数组:[1,2,1,3], [2,1,3], [1,3,4].
提示:
-
1 <= A.length <= 20000
-
1 <= A[i] <= A.length
-
1 <= K <= A.length
解题思路:
1,这是一个滑动窗口类题目,设置左右指针start,end
2,窗口内部问题可以拆分出两个子问题
A,K种不同值组成的子数组
B,A所得子数组中,移动左指针仍然满足题目要求的子数组
3,定义两个左指针start,start2
A,移动start和end,直到k>K,停止
B,移动start2,直到 k2<K停止
C,A[start:end],A[start+1:end],…,A[start2-1:end]都满足条件
D,个数为start2-start
func subarraysWithKDistinct(A []int, K int) int {
start:=0
start2:=0
m:=make(map[int]int)
m2:=make(map[int]int)
k:=0
k2:=0
sum:=0
for end:=0;end<len(A);end++{
k,start=startEnd(m,A,k,K,start,end,func(k int,K int)bool{ return k>K})
k2,start2=startEnd(m2,A,k2,K,start2,end,func(k int,K int)bool{ return k>=K})
fmt.Println(start,start2,end,k,k2)
sum+=start2-start
}
return sum
}
func startEnd(m map[int]int,A []int, k,K,start,end int,compare func(a,b int)bool)(int,int){
if m[A[end]]==0{
k++
}
m[A[end]]++
for compare(k,K){
m[A[start]]--
if m[A[start]]==0{
k--
}
start++
}
return k,start
}
关于“leetcode如何返回K个不同整数的子数组”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/224045.html