9阅网

您现在的位置是:首页 > 知识 > 正文

知识

javascript - 需要帮助获得最大和最小值差为1的最长和谐数组。

admin2022-11-07知识18

我改编了下面的问题,没有显示长度。 我想实际输出数组。

我们将谐数组定义为一个数组,其最大值和最小值之间的差值正好是1.现在,给定一个整数组,你需要在其所有可能的子序列中找到其最长的谐数子序列的长度。 (我正在尝试寻找实际的数组)

例子1:输入:[1,3,2,2,5,2,3,7]输出 [1,3,2,2,5,2,3,7]输出。5解释:"最长的和谐子序列是[3,2,2,2,3]。最长的和谐子序列是[3,2,2,2,3]。

我写了下面的代码,但我推入vals的值不正确。 我需要帮助找出如何纠正它。

const findLHS = (nums) => {
    const hash = new Map()
    let vals = []
    let min = nums[0], max = nums[0]
    for (let num of nums) {
        //logic for finding min and max in range is flawed
        min = min + max === 1 ? Math.min(min, num) : min
        max = max - min === 1 ? Math.max(max, num) : max
        hash.set(num, (hash.get(num) || 0) + 1)
        console.log(max);
    }

    //logic is flawed below
    for (let key of nums) {
        // if (hash.has(key + 1) && hash.has(key + 1) <= max) {
        //     vals.push(hash.get(key + 1))
        // }
        if (hash.has(key) === min || hash.has(key) === max) {
            vals.push(min) || vals.push(max)
        }
    }
    return vals
}

测试用例,以及我认为应该返回的内容。

console.log(findLHS([1, 3, 2, 2, 5, 2, 3, 7]))//5 [3,2,2,2,3]
console.log(findLHS([1, 2, 3, 4])) //2 [1,2]
console.log(findLHS([1, 2, 2, 1])) //4 [1,2,2,1]


【回答】:

我的看法是这样的。 以[1, 3, 2, 2, 5, 2, 3, 7]为例... ...

  • 阶段1:创建一个Map,对数值的数量进行统计。 例如,1=>1,3=>2,2=>3,5=>1,7=>1。
  • 第二阶段:寻找两个连续值之间的最大总和。 例如,1的见1x,2的见3x,所以在1和2之间,一共有4个值。 接下来,3的值是2x,但数组中没有4的值,所以移动到下一个Map元素。 所以,2的被看到3x,3的被看到2x,总共有5个值。 等等。
  • 第三阶段:最后,走原数组拉出值。 现在我们知道,对于一个数组的值为2,共有5个2's和3's的值,在数组中寻找2's和3's。

function findLHS( arr ) {

  // Count the number of occurrences of each value in the array...
  let count = new Map();
  arr.forEach( v => {
    count.set( v, ( count.get( v ) || 0 ) + 1 );
  } );
  
  // Now, find the largest count of two consecutive numbers.
  let maxKey;
  let maxCount = -1;
  count.forEach( ( val, key ) => {
    if ( count.get( key + 1 ) ) {
      let total = val + count.get( key + 1 );
      if ( maxCount < total ) {
        maxKey = key;
        maxCount = total;
      }
    }
  } );
  
  // Finally, return the result.
  if ( maxCount == -1 ) {
    return [];
  } 
  
  return arr.reduce( ( acc, val) => {
    if ( val == maxKey || val == maxKey + 1 ) {
      acc.push( val );
    }
    return acc
  }, [] );
    
}

console.log( findLHS( [ 1, 3, 2, 2, 5, 2, 3, 7] ) ); 
console.log( findLHS( [ 1, 2, 3, 4] ) );
console.log( findLHS( [ 1, 2, 2, 1 ] ) );