zoukankan      html  css  js  c++  java
  • 697-数组的度

    给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。
    你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
    示例 1:
    输入: [1, 2, 2, 3, 1]
    输出: 2
    解释: 
    输入数组的度是2,因为元素1和2的出现频数最大,均为2.
    连续子数组里面拥有相同度的有如下所示:
    [1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
    最短连续子数组[2, 2]的长度为2,所以返回2.
    
    示例 2:
    输入: [1,2,2,3,1,4,2]
    输出: 6
    
    注意:
    nums.length 在1到50,000区间范围内。
    nums[i] 是一个在0到49,999范围内的整数。
    
    
    解法一:
    public static int findShortestSubArray(int[] nums) {
            Map<Integer,Integer> map=new HashMap<>();
            List<Integer> list=new ArrayList<>();
            for (int a:nums)
            {
                map.put(a,map.containsKey(a)?map.get(a)+1:1);
                list.add(a);
            }
            int max=0;
            for (int i=0;i<nums.length;i++)
                max=map.get(nums[i])>max?map.get(nums[i]):max;
            int du=list.size();
            for (int i=0;i<nums.length;i++)
            {
                if (map.get(nums[i])==max&&du>(list.lastIndexOf(nums[i])-list.indexOf(nums[i])+1))
                {
                    du=list.lastIndexOf(nums[i])-list.indexOf(nums[i])+1;
                }
            }
            return du;
        }
    
    
    
    解法2:
     public static int findShortestSubArray(int[] nums) {
            int max=0;
            for (int a:nums)
                max=a>max?a:max;
            int maxSize[]=new int[max+1];
            int minSize[]=new int[max+1];
            int mapSize[]=new int[max+1];
            int du=1;
            for (int i=0;i<nums.length;i++)
            {
                int num=nums[i];
                if (minSize[num]==0)
                {
                    minSize[num]=i;
                    maxSize[num]=i;
                }else {
                    maxSize[num]=i;
                }
                du =Math.max(++mapSize[num],du);
            }
            int res=50001;
            for (int i=1;i<=max;i++)
            {
                if (du==mapSize[i])
                {
                    res=Math.min(res,maxSize[i]-minSize[i]+1);
                }
            }
            return res;
        }
  • 相关阅读:
    between and 相关
    SQL获取所有用户名,数据库名、所有表名、所有字段名及字段类型
    性能优化探讨与分析:
    设置自动收缩数据库
    服务器注册
    多表查询及区别
    sql孤立用户解决方法
    委托、事件、观察者模式
    非托管资源
    C# 预处理器指令
  • 原文地址:https://www.cnblogs.com/dloading/p/10820991.html
Copyright © 2011-2022 走看看