写点什么

【LeetCode】数组的度 Java 题解

用户头像
HQ数字卡
关注
发布于: 2021 年 02 月 20 日

题目

给定一个非空且只包含非负数的整数数组 nums,数组的度的定义是指数组里任一元素出现频数的最大值。


你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。


代码

public class DayCode {    public static void main(String[] args) {        int[] nums = new int[]{1,2,2,3,1,4,2};        int ans = new DayCode().findShortestSubArray(nums);        System.out.println("ans is " + ans);    }
/** * https://leetcode-cn.com/problems/degree-of-an-array/ * 时间复杂度是O(n),空间复杂度是O(n) * @param nums * @return */ public int findShortestSubArray(int[] nums) { int ans = Integer.MAX_VALUE; Map<Integer, DegreeNode> numDegreeMap = new HashMap<>(); int maxDegree = 0; for (int i = 0 ; i < nums.length; i++) { DegreeNode node = new DegreeNode(); if (numDegreeMap.containsKey(nums[i])) { node = numDegreeMap.get(nums[i]); node.degree += 1; } else { node.degree = 1; node.beginIdx = i; } node.endIdx = i; maxDegree = Math.max(maxDegree, node.degree); numDegreeMap.put(nums[i], node); }
for (DegreeNode item : numDegreeMap.values()) { if (item.degree == maxDegree) { ans = Math.min(ans, item.endIdx - item.beginIdx + 1); } } return ans; }
class DegreeNode { int degree; int beginIdx; int endIdx;
public DegreeNode () { this.degree = 0; this.beginIdx = 0; this.endIdx = 0; } }}
复制代码


总结

  • 这个题目操作比较复杂,定义一个对象,存储元素的 degree,beginIdx,endIdx,使代码更加简洁易懂,可读性更好!

  • 每日一题,加油!


发布于: 2021 年 02 月 20 日阅读数: 13
用户头像

HQ数字卡

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】数组的度Java题解