vue3源码中的最长递增子序列

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

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

 而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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

认识“数字图像”

不同领域的人对图像的概念有着不同的理解。从工程学角度上讲&#xff0c;“图”是物体透射或反射光的分布&#xff1b;“像”是人的视觉系统对图的接收在大脑中形成的印象或认识。因此&#xff0c;图像常与光照、视觉等概念联系在一起&#xff0c;光的强弱、光的波长以及物体的…

Java编程基础阶段笔记 day04 Java基础语法(下)

​ 面向对象编程 笔记Notes 面向对象三条学习主线 面向过程 VS 面向对象 类和对象 创建对象例子 面向对象的内存分析 类的属性&#xff1a;成员变量 成员变量 VS 局部变量 类的方法 方法的重载 可变个数形参 面向对象&#xff1a;封装性 访问权限修饰符 构造方法&…

汉诺塔递归算法

起源&#xff1a; 汉诺塔&#xff08;又称河内塔&#xff09;问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子…

Java编程基础阶段笔记 day 07 面向对象编程(上)

​ 面向对象编程 笔记Notes 面向对象三条学习主线 面向过程 VS 面向对象 类和对象 创建对象例子 面向对象的内存分析 类的属性&#xff1a;成员变量 成员变量 VS 局部变量 类的方法 方法的重载 可变个数形参 面向对象&#xff1a;封装性 访问权限修饰符 构造方法&…

谈“发表(撰写)学术论文的注意事项”

题记&#xff1a;做两个核心学术期刊的“数字图像处理”类审稿专家有一段时间了&#xff0c;在审稿过程中发现存在很多问题&#xff0c;所以在此就撰写学术论文过程中的一些注意事项&#xff0c;跟大家交流一下&#xff08;当然&#xff0c;文中的很多观点也是一些资深主编的看…

Vue/Angular中父窗口新开的子窗口关闭的时候刷新父窗口

最近遇到一个项目需求&#xff1a;Angular中父窗口新开的子窗口提交完信息关闭的时候刷新父窗口。 知识点&#xff1a; window.opener 概述 返回打开当前窗口的那个窗口的引用&#xff0c;例如&#xff1a;在window A中打开了window B&#xff0c;B.opener 返回 A. 语法 …

图像边缘特征

图像边缘是图像的重要特征&#xff0c;是图像中特性&#xff08;如像素灰度、纹理等&#xff09;分布的不连续处&#xff0c;图像周围特性有阶跃变化或屋脊状变化的那些像素集合。图像的边缘部分集中了图像的大部分信息&#xff0c;一幅图像的边缘结构与特点往往是决定图像特质…

HDU 6631 line symmetric(枚举)

首先能想到的是至少有一对相邻点或者中间间隔一个点的点对满足轴对称&#xff0c;那么接下来只需要枚举剩下的点对是否满足至多移动一个点可以满足要求。 第一种情况&#xff0c;对于所有点对都满足要求&#xff0c;那么Yes。 第二种情况&#xff0c;有一个点不满足要求&#x…

学习数字图像处理经验谈

一、面向应用&#xff1a;层层分解、抓住要点 我们学习数字图像处理的最终目的还是应用&#xff0c;不管是用它来研制产品还是研发项目抑或是研究课题&#xff0c;都要用数字图像处理的理论、方法和技术来解决实际问题。在此过程中&#xff0c;提高效率是非常重要的&#xff0c…

读javascript百炼成仙笑死笔记一

“自然是这样的&#xff0c;但是我现在这样改一下&#xff0c;你说结果是多少呢&#xff1f;”叶小凡诡异地笑了笑&#xff0c;然后打出一段比较奇特的代码。 var a 1; var b; var sum (b a --a) a-- b; “噗&#xff01;”看到这段代码&#xff0c;对面弟子差点一口老血…

C#调用存储过程的通用类

usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Data.SqlClient;usingSystem.Collections;usingSystem.Data;//摘要&#xff1a;数据访问助手。//作者&#xff1a;ZhiQiao//日期&#xff1a;2008/07/02namespaceZhiQiao.DataAccessHelper{ //存…

图灵奖得主(一)

本文转自&#xff1a;http://bbs.gxnu.edu.cn/bbsanc.php?path%2Fgroups%2FGROUP_5%2FProgramming%2Fother%2FM.1029997222.A A.M. Turing Award ACMs most prestigious technical award is accompanied by a prize of $25,000. It is given to an individual selected fo…

react-router-dom@6获取路由传参

目录 参数获取 1、子路由形式携带 2、问号(?)形式参数 3、事件跳转传参 router/index.tsx import App from "App"; import Home from "pages/Home"; import List from "pages/List"; import Detail from "pages/Detail"; import…

图灵奖得主(二)

本文转自&#xff1a;http://bbs.gxnu.edu.cn/bbsanc.php?path%2Fgroups%2FGROUP_5%2FProgramming%2Fother%2FM.1029997222.A 1987年度的图灵奖授予了IBM沃特森研究中心老资格的研究员 约翰科克(Johncocke)。 科克是从机械到数学、又从数学转到 计算机方向上来的学者。…

jQuery效果之滑动

jQuery 滑动方法有三种&#xff1a;slideDown()、slideUp()、slideToggle()。 jQuery slideDown() 方法用于向下滑动元素&#xff0c; 语法&#xff1a;$(selector).slideDown(speed,callback); 可选的 speed 参数规定效果的时长。它可以取以下值&#xff1a;"slow"、…

Error: This command has to be run with superuser privileges (under the root user on most systems).

意思是错误&#xff1a;此命令必须以超级用户权限&#xff08;在大多数系统上以root用户权限&#xff09;运行。所以当前的用户是普通用户&#xff0c;需要切换为超级用户&#xff08;root用户&#xff09;先输入在命令行中输入 su root 然后会出现Password&#xff1a;&#…

图灵奖得主(三)

本文转自&#xff1a;本文转自&#xff1a;http://bbs.gxnu.edu.cn/bbsanc.php?path%2Fgroups%2FGROUP_5%2FProgramming%2Fother%2FM.1029997222.A 继1979年度图灵奖首次授予一位加拿大学者K.E.Iverson之后&#xff0c; 1989年度的图灵 奖又一次授予加拿大学者威廉凯亨(Willia…

对微信公共号的理解

通过redirect_uri获取code 通过code和appid 获取access_token 进行鉴权 转载于:https://www.cnblogs.com/zhouyideboke/p/11309752.html

vue3 v-model变化

概览 就变化内容而言&#xff0c;此部分属于高阶内容&#xff1a; 非兼容&#xff1a;用于自定义组件时&#xff0c;v-model的 prop 和事件默认名称已更改&#xff1a; prop&#xff1a;value -> modelValue&#xff1b;event&#xff1a;input -> update:modelValue&a…

图灵奖得主(四)

本文转自&#xff1a;本文转自&#xff1a;本文转自&#xff1a;http://bbs.gxnu.edu.cn/bbsanc.php?path%2Fgroups%2FGROUP_5%2FProgramming%2Fother%2FM.1029997222.A 1991年度的图灵奖授予了爱丁堡大学计算机科学系教授罗 宾米尔纳(Robin Milner)。米尔纳是继M.V.Wilkes(1…