求解最长递增子序列是一道经典的算法题,

多数解法是使用动态规划的思想,算法的时间复杂度是O();

而Vue.js内部使用的是维基百科提供的一套“贪心+二分查找”的算法;

贪心算法的时间复杂度是O(n),二分查找的时间复杂度是O(logn),总时间复杂度是O(nlogn)

主要思路:

对数组遍历,依次求解长度为i时的最长递增子序列

当i元素大于i-1的元素时,添加i元素并更新最长子序列

否则往前查找直到找到一个比i小的元素,然后插在该元素后面并更新对应的最长递增子序列

主要目的:

让递增序列的差尽可能的小,从而可以获得更长的递增子序列,是一种贪心算法的思想

源码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><script>function getSequence(arr) {const p = arr.slice();const result = [0]; // 存储长度为I的递增子序列的索引let i, j, u, v, c;const len = arr.length;debugger;for (i = 0; i < len; i++) {const arrI = arr[i];if (arrI !== 0) {j = result[result.length - 1];// result存的最后一个值小于当前值if (arr[j] < arrI) {// 存储在result更新前的最后一个索引的值p[i] = j;result.push(i);continue;}u = 0;v = result.length - 1;// 二分搜索,查找比arrI小的节点,更新result的值while (u < v) {c = (u + v) >> 1;if (arr[result[c]] < arrI) {u = c + 1;} else {v = c;}}if (arrI < arr[result[u]]) {if (u > 0) {p[i] = result[u - 1];}result[u] = i;}}}u = result.length;v = result[u - 1];// 回溯数组p,找到最终的索引while (u-- > 0) {result[u] = v;v = p[v];}return result;}const arr = [2, 1, 5, 3, 6, 4, 8, 9, 7];const resultIndex = getSequence(arr);console.log("最长递增子序列的索引是:", resultIndex);let result = [];resultIndex.forEach((item, index) => {result.push(arr[item]);});console.log("最长递增子序列:", result);</script></body>
</html>

vue3源码中的最长递增子序列相关推荐

  1. 学习尤雨溪写的 Vue3 源码中的简单工具函数

    大家好,我是若川.最近组织了源码共读活动.每周读 200 行左右的源码.很多第一次读源码的小伙伴都感觉很有收获,感兴趣可以加我微信ruochuan12,拉你进群学习. 初学者也能看懂的 Vue3 源码 ...

  2. 初学者也能看懂的 Vue3 源码中那些实用的基础工具函数

    1. 前言 大家好,我是若川.最近组织了源码共读活动.每周读 200 行左右的源码.很多第一次读源码的小伙伴都感觉很有收获,感兴趣可以加我微信ruochuan12,拉你进群学习. 写相对很难的源码,耗 ...

  3. 编程之美 求数组中的最长递增子序列

    如题,例如:存在数组 1,-1,2,-3,4,-5,6,-7 ,则最长的递增子序列是:1,2,4,6. 法一: 蛮力法 int Lis(int* arr,int n) {int iCount=0;// ...

  4. 求数组中的最长递增子序列

    RT: 代码如下: 1 int lisq(int * a,int N) 2 { int e1=a[0],e2=a[0]; 3 int L1=1,L2=1; 4 int i; 5 6 for(i=1;i ...

  5. Vue3 最长递增子序列详解

    Vue3 最长递增子序列研究 本文初衷 彻底讲清楚 Vue3 源码中实现最长递增子序列的算法. 概念名词 **最长递增子序列:**在一个给定的数值序列中,找到一个子序列,使得这个子序列元素的数值依次递 ...

  6. 从 vue3 和 vite 源码中,我学到了一行代码统一规范团队包管理器的神器

    1. 前言 大家好,我是若川.最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步.已进行四个月了,很多小伙伴表示收获颇丰. 想学源码 ...

  7. 初学者也能看懂的 Vue2 源码中那些实用的基础工具函数

    1. 前言 大家好,我是若川.最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 想学源码,极力推荐之前我写的<学习源码整体架构系列>jQuery.underscore.l ...

  8. 程序员面试100题之十二:求数组中最长递增子序列

    写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 例如:在序列1,-1,2,-3,4,-5,6,-7中,其最长递增子序列为1,2,4,6. 分析与解法 根据题目要求, ...

  9. 求数组中最长递增子序列的长度

    题目:写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 例:在序列[1, -1, 2, -3, 4, -5, 6, -7]中,其最长递增子序列的长度为4([1, 2, ...

最新文章

  1. 原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
  2. java递归实现数组逆序_Java实现数组全排序(递归)
  3. 学习Cassandra资料的一些整理
  4. linux命令学习之:curl
  5. BZOJ1061 NOI2008 志愿者招募 线性规划、费用流
  6. 圆形led屏幕_展示厅LED大屏幕安装价格/芮城
  7. Java丨Ele实验室“疫情传播仿真程序”的代码实现
  8. 目前项目wordpress插件记录
  9. 【2019南昌邀请赛网络赛 B Greedy HOUHOU BZOJ 2957 楼房重建】线段树+二分
  10. .net平台下的手机在线wap网站模拟器(附源代码)
  11. java加密算法之JWT篇
  12. 7.nestjs文件上传
  13. i3-9100f和i5-9400f 的区别
  14. 论文排版LaTeX学习笔记
  15. mysql安装步骤及报错处理(windows)
  16. 最后采用加权求和的方式得到样本的_一种婴幼儿视力自动检测方法与流程
  17. iphone苹果二手手机购买前必看
  18. Day7 String类
  19. caj转pdf——包含下载链接
  20. Oracle 特殊符号‘‘的处理

热门文章

  1. 『设计模式』我能进来坐坐吗?--访问者模式
  2. shell中的比较(if运算)
  3. a label can only be part of a statement and a declaration is not a statement
  4. uCOS任务堆栈的深入分析(转)
  5. mac中修改系统限制量--ulimit和sysctl
  6. LLVM4更新--简化对象定义
  7. 图论为什么这么难_图论是什么,为什么要关心?
  8. python访问网页如何查看user-agent_HTTP请求头之User-Agent
  9. uiswitch样式_Swift - 表格UITableView的plain、grouped两种样式详解(附分组头悬停)
  10. python tcp通信如何实现多人聊天,Python实现多用户全双工聊天(一对一),python多用户,多用户全双工聊天简陋...