zoukankan      html  css  js  c++  java
  • Java实现 LeetCode 697 数组的度(类似于数组的map)

    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范围内的整数。

    PS:
    一个记录最左面的下标,一个记录右面的下标,一个记录这个数字出现的次数

    class Solution {
        public int findShortestSubArray(int[] nums) {
            int max = 0;
            for (int num : nums) {
                max = Math.max(num, max);
            }
    
            int[] leftMap = new int[max + 1];//用于元素最左索引(+1)
            int[] rightMap = new int[max + 1];//用于元素最右索引
            int[] countMap = new int[max + 1];//用于元素计数
            int maxCount = 0;
            for (int i = 0; i < nums.length; i++) {
                int num = nums[i];
                if (leftMap[num] == 0) {
                    leftMap[num] = i + 1;
                }
                rightMap[num] = i;
                countMap[num]++;
                if (countMap[num] > maxCount) {
                    maxCount = countMap[num];
                }
            }
    
            int res = nums.length;
            for (int num = 0; num < countMap.length; num++) {
                int count = countMap[num];
                if (count == maxCount) {
                    int length = rightMap[num] - leftMap[num] + 2;
                    if (length < res) {
                        res = length;
                    }
                }
            }
            return res;
        }
    }
    
  • 相关阅读:
    PHP install perl module
    PHP 静态页
    PHP对类的操作
    PHP Mysql操作。
    2020.7.16
    2020.7.19
    2020.7.14
    2020.7.12
    2020.7.17
    2020.7.10
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13074787.html
Copyright © 2011-2022 走看看