首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >golang刷leetcode 滑动窗口(2)K 个不同整数的子数组

golang刷leetcode 滑动窗口(2)K 个不同整数的子数组

作者头像
golangLeetcode
发布2022-08-02 15:53:28
发布2022-08-02 15:53:28
41200
代码可运行
举报
运行总次数:0
代码可运行

给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续、不一定独立的子数组为好子数组

(例如,[1,2,3,1,2] 中有 3 个不同的整数:12,以及 3。)

返回 A好子数组的数目。

示例 1:

代码语言:javascript
代码运行次数:0
运行
复制
输出: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:

代码语言:javascript
代码运行次数:0
运行
复制
输入:A = [1,2,1,3,4], K = 3
输出:3
解释:恰好由 3 个不同整数组成的子数组:[1,2,1,3], [2,1,3], [1,3,4].

提示:

  1. 1 <= A.length <= 20000
  2. 1 <= A[i] <= A.length
  3. 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

代码语言:javascript
代码运行次数:0
运行
复制
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
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档