思路
一个 Relationship 的 map。数组值作为 key,用一个 obj 作为值:
{
size
start
end
}
Array.from 转换 map,再跟进 size 排序。找出 end - start 最小的。
具体代码如下:
/**
* @param {number[]} nums
* @return {number}
*/
var findShortestSubArray = function(nums) {
let relations = new Map();
let len = nums.length;
for(let i = 0; i < len; ++i) {
let key = nums[i];
if(relations.has(key)){
let tmp = relations.get(key);
relations.set(key, {
start: tmp.start,
end: i,
size: tmp.size + 1
});
} else {
relations.set(key, {
start: i,
end: i,
size: 1
})
}
}
let list = Array.from(relations).sort((a, b) => {
return b[1].size - a[1].size;
})
let maxShow = list[0][1].size;
let pointer = 1;
let min = list[0][1].end - list[0][1].start;
let listLen = list.length;
while(pointer < listLen && list[pointer][1].size >= maxShow) {
let delta = list[pointer][1].end - list[pointer][1].start;
if (delta < min) {
min = delta;
}
pointer ++;
if (pointer >= listLen)
break;
}
return min + 1
};