首页 > 其他分享 >leetcode 697. Degree of an Array 数组的度(简单)

leetcode 697. Degree of an Array 数组的度(简单)

时间:2022-08-23 20:37:28浏览次数:85  
标签:degree 697 Degree nums int countMap num 数组 Array

一、题目大意

https://leetcode.cn/problems/degree-of-an-array

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

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

示例 1:

输入:nums = [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:

输入:nums = [1,2,2,3,1,4,2]
输出:6
解释:
数组的度是 3 ,因为元素 2 重复出现 3 次。
所以 [2,2,3,1,4,2] 是最短子数组,因此返回 6 。

提示:

  • nums.length 在 1 到 50,000 范围内。
  • nums[i] 是一个在 0 到 49,999 范围内的整数。

二、解题思路

首先给数组的度下一个定义,给一个数组,某个或某些数字出现最多的次数为该数组的度。题目要求我们找到最短的子数组使其和原数组拥有相同的度。

思路:统计每个数字出现的次数,用哈希来建立数字与出现次数的映射,我们要求与该数组有相同度的最小长度子数组,我们要知道每个数字的度,与其首次出现的位置,这样我们要定义两个哈希一个来存出现的次数,一个来存首次出现的位置。我们再定义一个变量degree来表示数组的度。遍历数组当前遍历位置可以看作是最后一次出现的位置即尾位置,累加当前数字出现的次数,如果数字是第一次出现,建立数字与首位置的映射,如果当前数字的出现次数等于degree时,当前位置为尾位置,用endIndex - startIndex + 1来更新结果;如果当前数字的出现次数大于degree,说明之前的结果代表的数字不是出现最多的,直接将结果更新为endIndex - startIndex + 1,然后degree也更新为当前数字出现的次数。

三、解题方法

3.1 Java实现

public class Solution {
    public int findShortestSubArray(int[] nums) {
        Map<Integer, Integer> countMap = new HashMap<>();
        Map<Integer, Integer> firstIdxMap = new HashMap<>();
        int ans = nums.length;
        int degree = 0;
        for (int i = 0; i < nums.length; i++) {
            int num = nums[i];
            countMap.put(num, countMap.getOrDefault(num, 0) + 1);
            // 记录首位置
            if (countMap.get(num) == 1) {
                firstIdxMap.put(num, i);
            }

            if (countMap.get(num) == degree) {
                ans = Math.min(ans, i - firstIdxMap.get(num) + 1);
            } else if (countMap.get(num) > degree) {
                ans = i - firstIdxMap.get(num) + 1;
                degree = countMap.get(num);
            }
        }
        return ans;
    }
}

四、总结小记

  • 2208/8/23 这两天天气不错

标签:degree,697,Degree,nums,int,countMap,num,数组,Array
From: https://www.cnblogs.com/okokabcd/p/16617669.html

相关文章

  • 【Java基础】操作数组的工具类Arrays
    1.常用方法方法描述booleanequals(int[]a,int[]b)判断两个数组是否相等,顺序不一样也返回falseStringtoString(int[]a)输出数组信息voidfill(int[]......
  • [Oracle] LeetCode 1802 Maximum Value at a Given Index in a Bounded Array
    Youaregiventhreepositiveintegers:n,index,andmaxSum.Youwanttoconstructanarraynums(0-indexed)thatsatisfiesthefollowingconditions:nums.len......
  • CF1715B Beautiful Array 题解
    思路根据题意,不难看出,当\(b>\dfrac{s}{k}\)时,一定无解,因为无论怎样分配\(s\),最终的结果一定不会比\(\dfrac{s}{k}\)更大。然后再来考虑当\(b\le\dfrac{s}{k}\)时,......
  • 面经-LinkedList与ArrayList比较
    ArrayList:1.基于数组,需要连续内存2.随机访问快(根据下标访问)。(按照内容查询时ArrayList与LinkedList速率基本相同)3.尾部插入、删除性能好,其他部分插入、删除都会移动数据......
  • 702-search-in-a-sorted-array-of-unknown-size
    Givenanintegerarraysortedinascendingorder,writeafunctiontosearchtargetinnums.Iftargetexists,thenreturnitsindex,otherwisereturn-1.However,t......
  • 面经-ArrayList扩容规则
    如果调用无参arrayList构造方法,则初始长度为0;如果构造带参的构造方法,则初始容量为指定长度。 1.调用add()方法1.第一次扩容为10(从0到9)。2.后续扩容都是前一次的1.5倍......
  • 练习5:常见Array原型方法实现
    Array.prototype.mapArray.prototype.map2=function(callbackfn,thisArg){if(this==null){thrownewTypeError('Cannotreadproperty"map"ofnullor......
  • Random类、ArrayList类
    Random类什么是Random类此类的实例用于生成伪随机数。例如,以下代码使用户能够得到一个随机数:Randomr=newRandom();inti=r.nextInt();Random使用步骤......
  • php对很大的二维数组做去重和求差集操作:array_filter太慢,array_map配合array_diff速度
    需求:长度大约10万级别的二维数组,元素内数组长度10个左右(其实就是一个数据表的结果集合),根据指定字段对数据进行去重,最后要得到去重后被丢弃的数据明细。 两个关键过程:......
  • Randomizing Arrays and Queues
    您可以随机化动态数组、关联数组和队列。可以将它们声明为“rand”或“randc”,这将导致数组的所有元素被随机化。数组中的所有元素都是随机的,每次随机(调用randomize())会......