Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 具有相同';学位';作为数组_Arrays_Algorithm - Fatal编程技术网

Arrays 具有相同';学位';作为数组

Arrays 具有相同';学位';作为数组,arrays,algorithm,Arrays,Algorithm,这个问题是在一次测验中提出的,问题是这样的: 我们为您提供了一个数组“a”,其元素范围为1-106,数组的最大大小可能为105。现在,我们需要找到与原始数组具有相同“度”的子数组的数量。数组的阶数定义为数组中最大出现元素的频率。多个元素可以具有相同的频率 我被这个问题困扰了大约一个小时,但想不出任何解决办法。我如何解决它 样本输入: 最频繁出现的元素称为模式;此问题将度定义为频率计数。你的任务是: 识别所有模式值。 对于每个模式值,找到该值的索引范围。例如,在数组中 [1, 1, 2, 1, 3

这个问题是在一次测验中提出的,问题是这样的:

我们为您提供了一个数组“a”,其元素范围为1-106,数组的最大大小可能为105。现在,我们需要找到与原始数组具有相同“度”的子数组的数量。数组的阶数定义为数组中最大出现元素的频率。多个元素可以具有相同的频率

我被这个问题困扰了大约一个小时,但想不出任何解决办法。我如何解决它

样本输入:
最频繁出现的元素称为模式;此问题将度定义为频率计数。你的任务是:

识别所有模式值。 对于每个模式值,找到该值的索引范围。例如,在数组中

[1, 1, 2, 1, 3, 3, 2, 4, 2, 4, 5, 5, 5]
有三种模式(1 2 5)的度数为3。指数范围如下:

1 - 0:3
2 - 2:8
5 - 10:12
您需要计算所有索引范围(子阵列),其中至少包括这三个范围中的一个

我对这个示例进行了裁剪,使其既有基本情况:重叠的模式,也有不重叠的模式。请注意,包含是一个模拟点:如果您有一个阵列,其中一个模式的范围包含另一个模式:

[0,1,1,1,0,0]

您可以完全忽略外部阵列:包含
0
的任何子阵列也将包含
1

分析


子数组由两个数字定义,即起始索引和结束索引。因为我们必须有0引用leet代码 解决

类解决方案{
公共int findShortestSubArray(int[]nums){
Map left=新的HashMap(),
右=新建HashMap(),计数=新建HashMap();
对于(int i=0;i
1 - 0:3
2 - 2:8
5 - 10:12
    class Solution {
        public int findShortestSubArray(int[] nums) {
            Map<Integer, Integer> left = new HashMap(),
                right = new HashMap(), count = new HashMap();

            for (int i = 0; i < nums.length; i++) {
                int x = nums[i];
                if (left.get(x) == null) left.put(x, i);
                right.put(x, i);
                count.put(x, count.getOrDefault(x, 0) + 1);
            }

            int ans = nums.length;
            int degree = Collections.max(count.values());
            for (int x: count.keySet()) {
                if (count.get(x) == degree) {
                    ans = Math.min(ans, right.get(x) - left.get(x) + 1);
                }
            }
            return ans;
        }

}