使用JavaScript求解森林树木美学排列判定及砍树方案计数问题
实现思路
首先明确符合美学要求的树木排列为严格摆动数组:相邻元素高度交替上升/下降,不存在连续上升、连续下降、相邻高度相等的情况。
解决问题分三步:
- 封装独立的判断函数,校验任意数组是否符合摆动数组要求
- 优先校验原数组是否符合要求,符合直接返回0
- 遍历每个位置模拟砍树,生成新数组校验是否合法,统计合法方案数,没有合法方案返回-1
原代码问题
你提供的代码逻辑完全不符合需求:仅统计了原数组中不符合摆动规则的三元组数量,既没有判断原数组本身的合法性,也没有模拟砍树操作、统计砍树后的合法方案,因此输出结果完全错误。
正确实现代码
// 辅助函数:判断数组是否符合美学要求 function isBeauty(arr) { if (arr.length <= 1) return true if (arr[0] === arr[1]) return false // 记录上一组的升降趋势:1为上升,-1为下降 let prevTrend = arr[1] > arr[0] ? 1 : -1 for (let i = 2; i < arr.length; i++) { if (arr[i] === arr[i-1]) return false const currentTrend = arr[i] > arr[i-1] ? 1 : -1 // 连续升降直接判定不合法 if (currentTrend === prevTrend) return false prevTrend = currentTrend } return true } function solution(A) { // 原数组已经合法直接返回0 if (isBeauty(A)) return 0 let validCount = 0 const len = A.length // 遍历每个位置模拟砍树 for (let cutIdx = 0; cutIdx < len; cutIdx++) { // 生成砍掉当前位置后的新数组 const newArr = A.slice(0, cutIdx).concat(A.slice(cutIdx + 1)) if (isBeauty(newArr)) validCount++ } // 没有合法方案返回-1,否则返回合法方案数 return validCount === 0 ? -1 : validCount }
测试用例验证
console.log(solution([3, 4, 5, 3, 7])) // 输出3,符合预期 console.log(solution([1, 2, 3, 4])) // 输出-1,符合预期 console.log(solution([1, 3, 1, 2])) // 输出0,符合预期 console.log(solution([1, 2, 3, 4, 2, 5])) // 输出-1,符合预期
内容的提问来源于stack exchange,提问作者SE.Edward
相关产品推荐
相关产品推荐

