【題目描述】
給定一個(gè)非空且只包含非負(fù)數(shù)的整數(shù)數(shù)組 nums, 數(shù)組的度的定義是指數(shù)組里任一元素出現(xiàn)頻數(shù)的最大值。
你的任務(wù)是找到與 nums 擁有相同大小的度的最短連續(xù)子數(shù)組,返回其長(zhǎng)度。
【示例 1】
輸入: [1, 2, 2, 3, 1]
輸出: 2
解釋:
輸入數(shù)組的度是2,因?yàn)樵?和2的出現(xiàn)頻數(shù)最大,均為2.
連續(xù)子數(shù)組里面擁有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短連續(xù)子數(shù)組[2, 2]的長(zhǎng)度為2,所以返回2.
【示例2】
輸入: [1,2,2,3,1,4,2]
輸出: 6
nums.length 在1到50,000區(qū)間范圍內(nèi)。
nums[i] 是一個(gè)在0到49,999范圍內(nèi)的整數(shù)。
【思路】
1、找到與原數(shù)組度相同的最短子數(shù)組
2、找到元素的第一次出現(xiàn)的index 和 最后一次出現(xiàn)的index
3、last-first+1 就是結(jié)果
func findShortestSubArray(_ nums: [Int]) -> Int {
var map = [Int:Int]()
var max = Int.min
for num in nums {
var value = map[num] ?? 0
value+=1
map[num] = value
if max < value {
max = value
}
}
var numArr = [Int]()
for key in map.keys {
if map[key] == max {
numArr.append(key)
}
}
var minCount = Int.max
for num in numArr {
var tmpCount = max
var firIndex = 0
var secIndex = 0
for i in 0..<nums.count {
if num == nums[i] && tmpCount == max {
firIndex = i
}
if num == nums[i] {
tmpCount-=1
}
if num == nums[i] && tmpCount == 0 {
secIndex = i
break
}
}
minCount = min((secIndex-firIndex+1), minCount)
}
return minCount
}