javascript - 需要帮助获得最大和最小值差为1的最长和谐数组。
我改编了下面的问题,没有显示长度。 我想实际输出数组。
我们将谐数组定义为一个数组,其最大值和最小值之间的差值正好是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 ] ) );