度是数组nums里出现频次最高的次数maxCount,找出nums里面度为maxCount的最小子序列的长度。
-
输入:nums = [1,2,2,3,1]
输出:2
度:2,最小子序列[2,2] -
思路:用哈希表存储数组里每个元素出现的次数,并记录其出现的第一个下标left和最后一个下标right,计算出left和right差值最小的长度即为答案。
var findShortestSubArray = function(nums) {
let map = {}
//遍历数组nums,将元素存入哈希表,键是数组元素,值为[出现次数,第一次出现下标,最后一次出现下标]
for (const [i, val] of nums.entries()) {
if (val in map) {
map[val][0] += 1
map[val][2] = i
} else {
map[val] = [1, i, i]
}
}
//找出最大的度,并找出最大度的子序列里right-left+1的最小值。
let maxVal = 0, minLen = 0
for (const [count, left, right] of Object.values(map)) {
if (count > maxVal) {
maxVal = count
minLen = right - left + 1
} else if (maxVal == count) {
if (right - left + 1 < minLen) {
minLen = right - left + 1
}
}
}
return minLen
- 用for of 遍历数组,同时拿到下标和值的方法
for (const [i, val] of nums.entries()){
}