vue3源码中的最长递增子序列
求解最长递增子序列是一道经典的算法题,
多数解法是使用动态规划的思想,算法的时间复杂度是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源码中的最长递增子序列相关推荐
- 学习尤雨溪写的 Vue3 源码中的简单工具函数
大家好,我是若川.最近组织了源码共读活动.每周读 200 行左右的源码.很多第一次读源码的小伙伴都感觉很有收获,感兴趣可以加我微信ruochuan12,拉你进群学习. 初学者也能看懂的 Vue3 源码 ...
- 初学者也能看懂的 Vue3 源码中那些实用的基础工具函数
1. 前言 大家好,我是若川.最近组织了源码共读活动.每周读 200 行左右的源码.很多第一次读源码的小伙伴都感觉很有收获,感兴趣可以加我微信ruochuan12,拉你进群学习. 写相对很难的源码,耗 ...
- 编程之美 求数组中的最长递增子序列
如题,例如:存在数组 1,-1,2,-3,4,-5,6,-7 ,则最长的递增子序列是:1,2,4,6. 法一: 蛮力法 int Lis(int* arr,int n) {int iCount=0;// ...
- 求数组中的最长递增子序列
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 ...
- Vue3 最长递增子序列详解
Vue3 最长递增子序列研究 本文初衷 彻底讲清楚 Vue3 源码中实现最长递增子序列的算法. 概念名词 **最长递增子序列:**在一个给定的数值序列中,找到一个子序列,使得这个子序列元素的数值依次递 ...
- 从 vue3 和 vite 源码中,我学到了一行代码统一规范团队包管理器的神器
1. 前言 大家好,我是若川.最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步.已进行四个月了,很多小伙伴表示收获颇丰. 想学源码 ...
- 初学者也能看懂的 Vue2 源码中那些实用的基础工具函数
1. 前言 大家好,我是若川.最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 想学源码,极力推荐之前我写的<学习源码整体架构系列>jQuery.underscore.l ...
- 程序员面试100题之十二:求数组中最长递增子序列
写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 例如:在序列1,-1,2,-3,4,-5,6,-7中,其最长递增子序列为1,2,4,6. 分析与解法 根据题目要求, ...
- 求数组中最长递增子序列的长度
题目:写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度. 例:在序列[1, -1, 2, -3, 4, -5, 6, -7]中,其最长递增子序列的长度为4([1, 2, ...
最新文章
- 原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
- java递归实现数组逆序_Java实现数组全排序(递归)
- 学习Cassandra资料的一些整理
- linux命令学习之:curl
- BZOJ1061 NOI2008 志愿者招募 线性规划、费用流
- 圆形led屏幕_展示厅LED大屏幕安装价格/芮城
- Java丨Ele实验室“疫情传播仿真程序”的代码实现
- 目前项目wordpress插件记录
- 【2019南昌邀请赛网络赛 B Greedy HOUHOU BZOJ 2957 楼房重建】线段树+二分
- .net平台下的手机在线wap网站模拟器(附源代码)
- java加密算法之JWT篇
- 7.nestjs文件上传
- i3-9100f和i5-9400f 的区别
- 论文排版LaTeX学习笔记
- mysql安装步骤及报错处理(windows)
- 最后采用加权求和的方式得到样本的_一种婴幼儿视力自动检测方法与流程
- iphone苹果二手手机购买前必看
- Day7 String类
- caj转pdf——包含下载链接
- Oracle 特殊符号‘‘的处理
热门文章
- 『设计模式』我能进来坐坐吗?--访问者模式
- shell中的比较(if运算)
- a label can only be part of a statement and a declaration is not a statement
- uCOS任务堆栈的深入分析(转)
- mac中修改系统限制量--ulimit和sysctl
- LLVM4更新--简化对象定义
- 图论为什么这么难_图论是什么,为什么要关心?
- python访问网页如何查看user-agent_HTTP请求头之User-Agent
- uiswitch样式_Swift - 表格UITableView的plain、grouped两种样式详解(附分组头悬停)
- python tcp通信如何实现多人聊天,Python实现多用户全双工聊天(一对一),python多用户,多用户全双工聊天简陋...