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 中,值数组的长度的最大值,就是原数组的度。
那我们把这些满足度的数字找出来,然后看每个数字对应的子数组长度,最短的那个就是我们要求的结果。
痕迹
没有过去,就没法认定现在的自己