最长和谐子序列
注意题目,可修改原数组顺序。
暴力
先排序使其有序。
function findLHS(nums: number[]): number {
nums.sort((a, b) => a - b)
let max = 0
for (let i = 0; i < nums.length; i++) {
let len = 0, flag = false, eq = 0
for (let j = i + 1; j < nums.length; j++) {
const diff = Math.abs(nums[i] - nums[j])
if (diff === 1) {
len++
flag = true
} else if (diff === 0) {
eq++
} else {
break
}
}
// 优化,跳过相同节点
i += eq
max = Math.max(max, (len ? len + 1 : 0) + (flag ? eq : 0))
}
return max
}
哈希表
先计数再求和。
function findLHS(nums: number[]): number {
const m = new Map()
nums.forEach(n => {
m.set(n, (m.get(n) || 0) + 1)
})
let max = 0
for (const [k, v] of m) {
const vn = m.get(k + 1)
if (vn) {
max = Math.max(max, v + vn)
}
}
return max
}