/**
* 求最长递增子序列
* @param {number[]} nums
*
*/
function LIS(nums) {
// 如果数组长度为0,则直接返回空数据
if (nums.length === 0) return [];
// 默认获取二维数组的第一行
const results = [[nums[0]]];
console.log(results, "第一行");
// 遍历数组,拿到数组的每一项并通过_update方法进行处理
for (let i = 1; i < nums.length; i++) {
const n = nums[i];
_update(n);
}
// 辅助函数,来处理数组每一项
function _update(n) {
// 从二维数组的最后一行开始遍历
for (let i = results.length - 1; i >= 0; i--) {
// 获取当前行
const line = results[i];
// 获取当前行最后的数字
const tail = line[line.length - 1];
// 如果n大于当前行的最后一个数字,则将n添加到当前行的下一行,并跳出循环
if (n > tail) {
results[i + 1] = [...line, n];
break;
}
// 如果n小于当前行的最后一个数字,则将n替换当前行的最后一个数字
else if (n < tail && i === 0) {
results[i] = [n];
}
}
}
console.log(results);
// 返回二维数组最后一行,最后一行就是最终得到的数组
return results[results.length - 1];
}
console.log(LIS([4, 5, 1, 2, 7, 3, 6, 9, 10]));
求最长递增子序列
最新推荐文章于 2025-05-31 16:02:29 发布