Lever's Castle

697. 数组的度

February 21, 2021

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

使用语言:Golang

func findShortestSubArray(nums []int) int {
    // 按照 num 分类,统计每个 num 出现的位置
    numToIndex := make(map[int][]int)
    for i, num := range nums {
        if _, ok := numToIndex[num];ok {
            numToIndex[num] = append(numToIndex[num], i)
        } else {
            numToIndex[num] = []int{i}
        }
    }

    var degree, minLen int
    for _, indexes := range numToIndex {
        // 寻找度对应的 num,以及 num 对应的最短数组
        // 当 num 对应的 indexes 的长度为度时,对应的最短数组一定是以该 indexes 的第一个元素为起始位置,最后一个元素为终止位置
        tempLen := indexes[len(indexes) - 1] - indexes[0] + 1
        if minLen == 0 {
            minLen = tempLen
        }
        if degree == 0 {
            degree = len(indexes)
        } else if degree == len(indexes) {
            if minLen > tempLen {
                minLen = tempLen
            }
        } else if degree < len(indexes) {
            degree = len(indexes)
            minLen = tempLen
        }
    }
    return minLen
}

数组的度,就是数组中重复数字的最大个数。在一个数组中可能有多个数字满足度的重复次数。

题目中要求的是数组的子数组中,与原数组度相同,并且最短的子数组的长度。

推理一下,与原数组度相同的子数组,必定包含了某一个由原数组中满足度的重复次数的数字全部成员。那只要找到这些子数组中最短的,我们就找到了答案。

所以第一步,我们先构造一个 map,把每个数字在数组中的索引存下来,值就是这些索引组成的数组。在这个 map 中,值数组的长度的最大值,就是原数组的度。

那我们把这些满足度的数字找出来,然后看每个数字对应的子数组长度,最短的那个就是我们要求的结果。


Lever

痕迹
没有过去,就没法认定现在的自己