697 Degree of an Array

697 Degree of an Array JAVA实现

  • 题目描述: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
  • 题目大意:给定一个非空数组,数组中的“度”表示数组中的元素出现最多次数的一个元素的次数,目的是在nums数组中去寻找小的子数组(必须连续),使子数组的度与原数组相同。

  • 思路:使用hashmap,建立两个hasmap,一个存储各个元素出现的次数,以寻找最大度,另一个存储,数组中每个元素出现的初始位置与结束位置,找到最大的度之后,再次遍历数组

  • 代码

    package Array;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class Solution {
      public int findShortestSubArray(int[] nums) {
          int degree = 0;
          int minSize = nums.length;
          Map<Integer, Integer> map = new HashMap<>();
          Map<Integer, Integer[]> map2 = new HashMap<>();
          for(int i=0;i<nums.length;i++) {
              map.put(nums[i], map.getOrDefault(nums[i],0) + 1);
              degree = Math.max(degree, map.get(nums[i]));
              if (map2.get(nums[i]) == null) {
                  map2.put(nums[i], new Integer[2]);
              }
              Integer[] numsRange = map2.get(nums[i]);
              if(numsRange[0]==null) numsRange[0] = i;
              numsRange[1] = i;
          }
          for (Integer key : map.keySet()) {
              if (map.get(key) != degree) {
                  continue;
              }
              Integer[] rang = map2.get(key);
              minSize = Math.min(minSize, rang[1] - rang[0] + 1);
          }
    
          return minSize;
    
      }
    
    
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值