Skip to content

594. 最长和谐子序列

js
;(function () {
  /**
   * 594. 最长和谐子序列
   * 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。
   * 现在,给你一个整数数组 nums ,请你在所有可能的子序列中找到最长的和谐子序列的长度。
   * 数组的子序列是一个由数组派生出来的序列,它可以通过删除一些元素或不删除元素、且不改变其余元素的顺序而得到。
   *
   * 输入:nums = [1,3,2,2,5,2,3,7]
   * 输出:5
   * 解释:最长的和谐子序列是 [3,2,2,2,3]
   *
   * 输入:nums = [1,2,3,4]
   * 输出:2
   *
   * 输入:nums = [1,1,1,1]
   * 输出:0
   *
   */

  function findLHS(nums: number[]): number {
    // 方法一:枚举?滑动窗口?
    // nums.sort((a, b) => a - b);
    // let s = 0;
    // let res = 0;
    // for (let e = 0; e < nums.length; e++) {
    //     while (nums[e] - nums[s] > 1) {
    //         s++
    //     }
    //     if (nums[e] - nums[s] === 1) {
    //         res = Math.max(res, e - s + 1)
    //     }
    // }
    // return res

    // 方法二: 哈希表
    let cns = new Map()
    let res = 0
    for (const num of nums) {
      cns.set(num, (cns.get(num) || 0) + 1)
    }
    cns.forEach((value: number, key: number) => {
      if (cns.get(key + 1)) {
        res = Math.max(res, cns.get(key) + cns.get(key + 1))
      }
    })
    return res
  }

  const nums = [1, 3, 2, 2, 5, 2, 3, 7]
  console.log(findLHS(nums))
})()