龙空技术网

【JS 最长递增子序列】简单实现一个最长递增子序列

夏末 53

前言:

目前小伙伴们对“最大连续子序列和最大子段和 动态规划算法”可能比较注意,小伙伴们都需要知道一些“最大连续子序列和最大子段和 动态规划算法”的相关文章。那么小编同时在网络上汇集了一些对于“最大连续子序列和最大子段和 动态规划算法””的相关文章,希望各位老铁们能喜欢,看官们一起来了解一下吧!

ps: 最长递增子序列是指在一个给定的数值序列中,找到一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能地大。最长递增子序列中的元素在原序列中不一定是连续的。

最长递增子序列第一次听说的时候,是了解vue3源码的时候。vue3对之前的diff算法进行了改进,其中一个重要改动便是对diff使用了最长递增子序列,来减少diff次数,所以在vue3中,我们会发现大规模遍历依赖的时候,速度有了很大的提升。下面是使用二维数组来实现的一个简易最长递增子序列方法:

/** * 最长递增子序列(Longest Increasing Subsequence) * @nums 数值序列 *  [3,4,5,1,2,6,9,7,8,10] *  @return [3,4,5,6,7,8,9,10] */function LIS(nums) {  // 判断传参是否为空  if(!Array.isArray(nums)) return null;  if(nums.length === 0) return [];  // 定义一个数组,用来存储最长递增长子序列,默认是参数第一项  const result = [[nums[0]]]  //遍历参数  for (let index = 1; index < nums.length; index++) {    const num = nums[index];    //定义一个排序变更result    sort(num)  }  function sort(n) {    // 从后遍历result,目的是取数组最后一个元素,减少遍历排序的次数    for(let i=result.length-1;i>=0;i--){      // 获取最后一组元素      const line=result[i]      // 获取最后一组元素的最后一个元素      const last=line[line.length-1]      if(n>last){        // 如果n大于最后一个元素,就将n添加到最后一组元素中,并跳出循环        result[i+1] = [...line,n]        return      }    }    // 当n小于最后一个元素,就将n添加到数组的第一个元素中    result[0] = [n]  }  //返回最后一组数据  return result.slice(-1)[0]}

测试

let nums = [3,4,5,1,2,6,9,7,8,10]LIS(nums)// [3,4,5,6,7,8,9,10]

标签: #最大连续子序列和最大子段和 动态规划算法