leetcode-697. Degree of an Array

697. Degree of an Array

Given a non-empty array of non-negative integers nums, the degree of this array is defined as the maximum frequency of any one of its elements.

Your task is to find the smallest possible length of a (contiguous) subarray of nums, that has the same degree as nums.

Example 1:

Input: [1, 2, 2, 3, 1]
Output: 2
Explanation: 
The input array has a degree of 2 because both elements 1 and 2 appear twice.
Of the subarrays that have the same degree:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
The shortest length is 2. So return 2.

Example 2:

Input: [1,2,2,3,1,4,2]
Output: 6

Note:

  • nums.length will be between 1 and 50,000.
  • nums[i] will be an integer between 0 and 49,999.


    思路:

    肯定很容易想到 先找到数组里出现次数最多的数,在用最后一次出现的位置减去第一次出现的位置,还要考虑到又出现频率一样的数,怎么计算度,问题就是怎么组织数据来实现

    一开始我也想到这方法,但是却不知道怎么组织数据,一开始用数组来存元素的次数,用数组来计算度,但是遇到次数一致的就无法解决。而且用数组来存次数也需要开一个很大的数组也考虑了用map


    后来看了discuss,思路是一样的,但是用的map<Integer,int[]>,自己没想到

    class Solution {
         public int findShortestSubArray(int[] nums) {
            if (nums.length == 0 || nums == null) return 0;
            Map<Integer, int[]> map = new HashMap<>();
            for (int i = 0; i < nums.length; i++){
               if (!map.containsKey(nums[i])){
                   map.put(nums[i], new int[]{1, i, i});  // the first element in array is degree, second is first index of this key, third is last index of this key
               } else {
                   int[] temp = map.get(nums[i]);
                   temp[0]++;
                   temp[2] = i;
               }
            }
            int degree = Integer.MIN_VALUE, res = Integer.MAX_VALUE;
            for (int[] value : map.values()){
                if (value[0] > degree){
                    degree = value[0];
                    res = value[2] - value[1] + 1;
                } else if (value[0] == degree){
                    res = Math.min( value[2] - value[1] + 1, res);
                } 
            }
            return res;
        }
    }

    其中的
                   int[] temp = map.get(nums[i]);
                   temp[0]++;
                   temp[2] = i;
    是能带改变map里的value的值的。。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值