zoukankan      html  css  js  c++  java
  • leetcode 992. Subarrays with K Different Integers

    题目内容

    Given an array A of positive integers, call a (contiguous, not necessarily distinct) subarray of A good if the number of different integers in that subarray is exactly K.

    (For example, [1,2,3,1,2] has 3 different integers: 1, 2, and 3.)

    Return the number of good subarrays of A.

    Example:
    Input: A = [1,2,1,2,3], K = 2
    Output: 7
    Explanation: Subarrays formed with exactly 2 different integers: [1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2].
    Example 2:
    
    Input: A = [1,2,1,3,4], K = 3
    Output: 3
    Explanation: Subarrays formed with exactly 3 different integers: [1,2,1,3], [2,1,3], [1,3,4].
    

    分析过程

    • 题目归类:
      array
    • 题目分析:
      ij 为字串首和尾
      那hashmap 来保存每一个结果,对于hashmap的key数不能超过K个,设置flag 来保存当前k的值
        添加string.charAt(j)hashmap中,并判断目前的flag 和 K 的关系
        1. 小于K
        j右移
        2. 等于k
        sum ++;
        j++;
        3.大于k
        hashmap中的s.charAt(i++)减一,如果减到0了,则直接删除这个key/value;
      
    • 边界分析:
      • 空值分析
      • 循环边界分析
        j == s.length()时停止
    • 方法分析:
      • 数据结构分析
        hashmap就是比较适合做这种题目
      • 状态机
      • 状态转移方程
      • 最优解
    • 测试用例构建
      [] 0,
      [aaa],

    代码实现 大数据会超时,所以学习别人的方法

    import java.util.*;
    class Solution {
        public int subarraysWithKDistinct(int[] A, int K) {
             
            HashMap<Integer,Integer> map = new HashMap<>();
            int flag = 0;
            int sum  = 0;
            int i = 0,j = 0;
            int addFlag = 0;
            while(j<A.length){
                if(map.containsKey(A[j])&&addFlag == 0)
                    map.put(A[j],map.get(A[j])+1);
                else if(addFlag == 0){
                    map.put(A[j],1);
                    flag++;
                }
                    
                if(flag < K) {
                    j++;
                    addFlag=0;
                }else if (flag == K){
                    sum++;
                    int m = i + 1;
                    while(m<=j){
                        int n = m;
                        HashMap<Integer,Integer> map1 = new HashMap<>();
                        while(n<=j){
                            if(map1.containsKey(A[n]))
                            map1.put(A[n],map.get(A[n])+1);
                        else{
                            map1.put(A[n],1);
                            }
                             n++;
                        }
                        if(map1.size()==K)
                            sum++; 
                        m++;
                    }
                    j++;
                    addFlag=0;
                }else{
                    map.put(A[i],map.get(A[i])-1);
                    if(map.containsKey(A[i])&&map.get(A[i])==0){
                        map.remove(A[i]);
                        flag--;
                    }
                    i++;
                    addFlag=1;
                }
            }
            return sum;
        }
    }
    

    学习待续

    拓展问题

  • 相关阅读:
    如何选择机器学习算法 转
    机器学习经典算法详解及Python实现--基于SMO的SVM分类器
    机器学习(Machine Learning)&深度学习(Deep Learning)资料
    计算智能在设备状态维护中的应用
    LaTeX 在编译时出现 File ended while scanning use of @writefile错误
    LaTeX 中插入图片使其紧跟插入的文字之后
    LaTeX 制作表格
    LaTeX 中换段落
    LaTeX 中使用三级标题
    使用 WinEdt 来写中文文章or 建模论文
  • 原文地址:https://www.cnblogs.com/clnsx/p/12273353.html
Copyright © 2011-2022 走看看