1、题目
594. 最长和谐子序列 - 力扣(LeetCode) (leetcode-cn.com)
2、实现
(1)方法一:哈希表(个人感觉这个更好理解,可能我对滑动窗口的做法不太熟悉吧)
代码
/**
* @param {number[]} nums
* @return {number}
*/
var findLHS = function(nums) {
let map = new Map();
for(let i of nums) {
if(!map.has(i)) {
map.set(i, 1);
} else {
map.set(i, map.get(i)+1);
}
}
let res = 0;
for(let key of map.keys()) {
if(map.has(key-1)) {
res = Math.max(res, map.get(key-1)+map.get(key));
}else if(map.has(key+1)){
res = Math.max(res, map.get(key)+map.get(key+1));
}
}
return res;
};
(2)方法二:排序+滑动窗口
代码
/**
* @param {number[]} nums
* @return {number}
*/
var findLHS = function(nums) {
// 排序+滑动窗口
nums.sort((a, b) => a - b);
let res = 0;
// 左指针i,右指针j
for(let i=0,j=0; j<nums.length; j++) {
// 当右指针元素和左指针元素差值大于1时,左指针右移
while(i<j && nums[j]-nums[i] > 1) i++;
// 判断差值是否为1,如果为1,计算滑动窗口的大小,并与之前的窗口进行比较
if(nums[j] - nums[i] === 1) {
res = Math.max(res, j - i + 1);
}
}
return res;
};
3、参考
【宫水三叶】一题双解 :「滑动窗口」&「哈希计数」 - 最长和谐子序列 - 力扣(LeetCode) (leetcode-cn.com)