前言:
目前小伙伴们对“最大连续子序列和最大子段和 动态规划算法”可能比较注意,小伙伴们都需要知道一些“最大连续子序列和最大子段和 动态规划算法”的相关文章。那么小编同时在网络上汇集了一些对于“最大连续子序列和最大子段和 动态规划算法””的相关文章,希望各位老铁们能喜欢,看官们一起来了解一下吧!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]
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #最大连续子序列和最大子段和 动态规划算法