跳到主要内容

697.数组的度

链接:697.数组的度
难度:Easy
标签:数组、哈希表
简介:给定一个非空且只包含非负数的整数数组  nums,数组的度的定义是指数组里任一元素出现频数的最大值。你的任务是在 nums 中找到与  nums  拥有相同大小的度的最短连续子数组,返回其长度。

题解 1 - typescript

  • 编辑时间:2021-02-20
  • 执行用时:208ms
  • 内存消耗:45.3MB
  • 编程语言:typescript
  • 解法介绍:读取到度后直接取头尾进行判断。
function findShortestSubArray(nums: number[]): number {
const map = new Map<number, number>();
nums.forEach(num => map.set(num, 1 + (map.get(num) ?? 0)));
const degreeValue = Math.max(...map.values());
const degreeList = [];
for (const [k, v] of map) v === degreeValue && degreeList.push(k);
return Math.min(...degreeList.map(num => nums.lastIndexOf(num) - nums.indexOf(num) + 1));
}

题解 2 - typescript

  • 编辑时间:2021-02-20
  • 执行用时:104ms
  • 内存消耗:46.3MB
  • 编程语言:typescript
  • 解法介绍:优化题解 1。
function findShortestSubArray(nums: number[]): number {
const indexMap = new Map<number, [number, number]>();
const computeIndex = (num: number) => {
const [start, end] = indexMap.get(num)!;
return end - start + 1;
};
const map = new Map<number, number>();
for (let i = 0, len = nums.length; i < len; i++) {
const num = nums[i];
map.set(num, 1 + (map.get(num) ?? 0));
const indexes = indexMap.get(num);
if (indexes) {
indexes[1] = i;
} else {
indexMap.set(num, [i, i]);
}
}
const degreeValue = Math.max(...map.values());
const degreeList = [];
for (const [k, v] of map) v === degreeValue && degreeList.push(k);
return Math.min(...degreeList.map(num => computeIndex(num)));
}

题解 3 - typescript

  • 编辑时间:2021-02-20
  • 执行用时:100ms
  • 内存消耗:44.4MB
  • 编程语言:typescript
  • 解法介绍:优化题解 1。
function findShortestSubArray(nums: number[]): number {
const map: Record<number, [number, number, number]> = {};
nums.forEach((num, i) => {
const data = map[num];
if (data) {
data[0]++;
data[2] = i;
} else {
map[num] = [1, i, i];
}
});
const data = Object.values(map);
const degreeValue = Math.max(...data.map(([c]) => c));
return Math.min(
...data.filter(([c]) => c === degreeValue).map(([, start, end]) => end - start + 1)
);
}