前端算法学习,包含复杂度、双指针、滑动窗口、二叉树、堆等常见题型和方法,含leetcode例题

前端算法题

学习

复杂度

  1. 时间复杂度
    代码的运行时间随着数据规模增长的趋势
  • 最好情况的时间复杂度:O(1)
  • 最坏情况的时间复杂度
  • 平均情况下的时间复杂度
  • 均摊复杂度:
  1. 空间复杂度

双指针

两个指针同向、背向移动

  1. 快慢指针
    可以用于判断链表中是否有环

  2. 背向指针

//长度为n的数组nums和目标值target,从nums选中三个整数,使它们的和与target最接近
//返回这三个数的和function threeSumClosest(nums, target) {//思路:先排序,循环target-数组里的数字,此时就变成两数之和//两个指针分别从头和尾向中间走let length=nums.length;let res=Infinity;nums.sort((a,b)=>a-b);for(let i =0;i<length;i++){//依次获取其中元素let left=i+1;let right=length-1;//变成判断两数之和与curr最接近while(left<right){let currRes=nums[i]+nums[left]+nums[right];if(Math.abs(currRes-target)<Math.abs(res-target)){res=currRes;}if(currRes<target){left++}else if(currRes>target){right--}else{return res}}}return res
}console.log(threeSumClosest([-1,2,1,-4],1))
//给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。
//如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。var findLongestWord = function(s, dictionary) {//双指针let left=0;let right=0;let str='';//进行判断for(let word of dictionary){//左指针在等到判断的字符串s中//右指针在等待判断的数组的字符串中left = 0;right = 0;//如果字符串长度大于原字符串,直接跳过if(word.length>s.length){continue;}while(left<s.length && right <word.length){//如果字母相同,指针移动if(s.charAt(left)===word.charAt(right)){right++;}left++;}if (right === word.length) {if (!str || (word.length > str.length || (word.length === str.length && word < str))) {str = word;}}}return str;
};console.log(findLongestWord("abpcplea",["ale","apple","monkey","plea", "abpcplaaa","abpcllllll","abccclllpppeeaaaa"]))

双指针题目思路:在循环前判断是否需要排序、遍历过程中通过双指针根据结果判断是否需要重新赋值

滑动窗口

窗口大小可变

//给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。//滑动窗口题思路:右侧指针移位->判断是否符合预期->判断左指针是否需要移位->下一次循环
function lengthOfLongestSubstring(s) {if(s.length<=1){return s.length;}let left=0;let right=1;let maxLength=0;let temp=''while(right<s.length){temp=s.slice(left,right);//如果窗口的下一个元素被包含在temp中,窗口就移动if(temp.indexOf(s[right])!=-1){left++;continue;}else{right++;maxLength=Math.max(maxLength,right-left);}}return maxLength;
}console.log(lengthOfLongestSubstring("abcabcbb"))

二叉树

常见问题是求任意两个节点的最小的公共祖先

二叉树问题要搞清楚排序的方式和当前树和节点的逻辑(处于同一侧or处于不同侧)

/*** 寻找最近公共祖先* @param {TreeNode} root * @param {TreeNode} p * @param {TreeNode} q * @returns*/
function lowestCommonAncestor(root, p, q) {//如果是null,已到达叶子节点的边界,没有找到目标//如果是p或q,说明当前节点就是最近祖先,直接返回if (root == null || root == p || root == q) return root;const left = lowestCommonAncestor(root.left, p, q);const right = lowestCommonAncestor(root.right, p, q);//如果left和right都不为空,说明p和q分别位于左右子树中,当前节点就是最近祖先if (left && right) return root;//只有一个left或right不为空,目标节点在同一侧子树中,直接返回对应子树的根节点return left || right;
}

涉及top、最大、最小的题目,用堆

//仓库管理员以数组 stock 形式记录商品库存表,
//其中 stock[i] 表示对应商品库存余量。
//请返回库存余量最少的 cnt 个商品余量,返回 顺序不限。//使用堆
//1. 原生API
// return stock.sort((a, b) => a - b).slice(0, cnt);
//2.计数排序:核心在于将输入的数据转化为key,使用空间换时间
var inventoryManagement = function(stock, cnt) {return countingSort(stock, cnt)};//计数排序
const countingSort=function(stock,cnt){let bucket=new Array()let sortedIndex=0for(let i=0;i<stock.length;i++){bucket[stock[i]]=bucket[stock[i]]+1 || 1}let res=[];for(let j=0;j<bucket.length;j++){while(bucket[j]-- > 0 && sortedIndex<cnt){res[sortedIndex++]=j}if(sortedIndex==cnt){break}}return res
}console.log(countingSort([0,2,3,6],2))
//给定一个整数数组 nums 和一个整数 k ,请返回其中出现频率前 k 高的元素。可以按 任意顺序 返回答案。var topKFrequent = function(nums, k) {let map=new Map()for(let i=0;i<nums.length;i++){if(map.get(nums[i])){map.set(nums[i],map.get(nums[i])+1)}else{map.set(nums[i],1)}}//将map转为数组,数组中每个元素也都是一个数组let entries=Array.from(map.entries())return entries.sort((a,b)=>b[1]-a[1]).slice(0,k).map(item=>item[0])
};console.log(topKFrequent([1,1,1,2,2,3],2))//使用桶排序的方法var topKFrequent = function(nums, k) {//桶排序,将数据划分到有限个桶中,再将桶进行排序//用map存储频次,用数组表达桶,频次作为数组下标let map=new Map()for(let i=0;i<nums.length;i++){if(map.has(nums[i])){map.set(nums[i],map.get(nums[i])+1)}else{map.set(nums[i],1)}}if(map.size<=k) return [...map.keys()]return bucketSort(map,k)};//桶排序
const bucketSort=(map,k)=>{let arr=[]let res=[]//map每个元素map.forEach((value,key)=>{//使用频次作为下标,将数据分配到桶中if(arr[value]){arr[value].push(key)}else{arr[value]=[key]}})for(let i=arr.length;i>=0 && res.length<k;i--){if(arr[i]){res.push(...arr[i])}}return res
}console.log(topKFrequent([1,1,1,2,2,3],2))

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

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

相关文章

fastadmin 根据选择数据来传参给selectpage输入框

文章目录 js代码php代码&#xff1a;完结 js代码 $(document).on(change,#table .bs-checkbox [type"checkbox"],function(){let url$(#chuancan).attr(data-url)urlurl.split(?)[0]let idsTable.api.selectedids(table)if(ids.length){let u_id[]ids.forEach(eleme…

Seata学习笔记

目录 Seata的三大角色 角色 相关流程 相关事务模式 AT 模式&#xff08;默认模式&#xff09; 概述 整体机制 分析 XA 模式 概述 机制 分析 TCC 模式 概述 机制 分析 SAGA 模式 概述 机制 分析 参考&#xff1a; Seata的三大角色 角色 TC (Transaction Co…

虚拟机:4、配置12.5的cuda和gromacs

前言&#xff1a;本机环境是win11&#xff0c;通过wsl2安装了ubuntu实例并已实现gpu直通&#xff0c;现在需要下载12.5的cuda 一、查看是否有gpu和合适的cuda版本 在ubuntu实例中输入 nvidia-smi输出如下&#xff1a; 说明该实例上存在gpu驱动&#xff0c;且适合的CUDA版本…

智能新突破:AIOT 边缘计算网关让老旧水电表图像识别

数字化高速发展的时代&#xff0c;AIOT&#xff08;人工智能物联网&#xff09;技术正以惊人的速度改变着我们的生活和工作方式。而其中&#xff0c;AIOT 边缘计算网关凭借其强大的功能&#xff0c;成为了推动物联网发展的关键力量。 这款边缘计算网关拥有令人瞩目的 1T POS 算…

VS Code 技巧

在编程世界里&#xff0c;工具的好坏取决于使用者的水平。Visual Studio Code&#xff08;VS Code&#xff09;就像一把锋利的刀&#xff0c;它功能强大&#xff0c;但需要熟练的技巧才能发挥出色。然而&#xff0c;对于初学者来说&#xff0c;它可能显得有些复杂&#xff0c;因…

9.Branch-and-Bound 方法

Branch-and-Bound 方法 Branch-and-Bound&#xff08;分支限界&#xff09;是一种用于解决优化问题的算法框架&#xff0c;尤其适用于组合优化问题&#xff0c;如整数规划、旅行商问题&#xff08;TSP&#xff09;、指派问题等。该方法通过系统地搜索解空间树来找到问题的最优…

[spring]springboot日志

文章目录 一. 日志的用途二. 打印日志三. 日志框架门面模式(外观模式)SLF4J框架介绍 四. 日志格式日志级别配置日志级别日志持久化配置日志文件分割配置日志格式 五. 更简单的日志输出 一. 日志的用途 二. 打印日志 得到日志对象: 需要使用日志工厂LoggerFactory RestControl…

【小程序】uniapp自定义图标组件可动态更换svg颜色

组件描述 通过图标名称加载对应svg&#xff0c;size参数调整图标大小&#xff0c;color参数调整图标颜色 解决思路&#xff1a; 存svg获svg&#xff0c;对象方式正则替换svg的fill值&#xff0c;不改变源文件&#xff0c;通过base64直接加载缓存svg源文件&#xff0c;避免重…

聚铭下一代智慧安全运营中心荣获CNNVD兼容性资质证书

近日&#xff0c;聚铭网络旗下安全产品——聚铭下一代智慧安全运营中心正式通过了国家信息安全漏洞库&#xff08;CNNVD&#xff09;兼容性认证测试&#xff0c;荣获国家信息安全漏洞库兼容性资质证书。 关于CNNVD兼容性 国家信息安全漏洞库&#xff08;CNNVD&#xff09;是…

2003-2022年各省区域创新能力评价相关指标数据(报告年份2003-2022年)

2003-2022年各省区域创新能力相关指标数据&#xff08;报告年份2003-2022年&#xff09; 1、来源&#xff1a;2003-2022年中国区城创新能力评价报告 2、指标&#xff1a;综合值、知识创造综合指标、研究开发投人综合指标、专利综合指标、科研论文综合指标、知识获取综合指标、…

CSS02-字体属性、文本属性

一、字体属性 CSS Fonts(字体)属性用于定义字体系列、大小、粗细、和文字样式(如斜体)。 1-1、font-family属性 当font-family有多个值的时候&#xff0c;代码会依次查找当前系统中存在哪种字体&#xff0c;有则使用&#xff0c;没有则查找下一个字体。 1-2、font-size属性 1-3…

解决ArmDS Fast Models 中部分内核无法上电的问题

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决ArmDS Fast Models 中部分内核无法上电的问题。 2、 问题场景 在调用ArmDS的Fast Models中的Cortex-A55的模型&#xff0c;只有Core 0是上电状态&#xff0c;而Core 1处于掉电状态&#xff0c;如图2-1所示&…

AI大模型日报#0923:李飞飞创业之后首个专访、华为云+腾讯音乐发布昇腾适配方案

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;、“智谱AI”&#xff08;glm-4-0520&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅…

基于单片机无线智能报警系统的设计

文章目录 前言资料获取设计介绍功能介绍设计程序具体实现截图设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…

计算机毕业设计 基于Python的荣誉证书管理系统 Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

2024全球超模大赛(北京|山东|内蒙三城联动)顺利举办

近日&#xff0c;2024 全球超模大赛&#xff08;北京|山东|内蒙&#xff09;三城联动暨新国潮文化赛事主题发布会在紫薇美力集团国贸鲁采赋盛大举行。此次发布会旨在鼓励优质模特共同传播中国传统文化&#xff0c;让其在全球范围内绽放光彩&#xff0c;展现中国人的骄傲与风采&…

用Python提取PowerPoint演示文稿中的音频和视频

将多种格式的媒体内容进行重新利用&#xff08;如PowerPoint演示中的音频和视频&#xff09;是非常有价值的。无论是创建独立的音频文件、提取视频以便在线分发&#xff0c;还是为了未来的使用需求进行资料归档&#xff0c;从演示文稿中提取这些媒体文件可以为多媒体内容的多次…

基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示,设置电流阈值为80,电流小阈值为50,电压阈值为60,温度阈值为30 随便哪个超过预祝,则继电器切断,LE…

【sgCreateCallAPIFunctionParam】自定义小工具:敏捷开发→调用接口方法参数生成工具

<template><div :class"$options.name" class"sgDevTool"><sgHead /><div class"sg-container"><div class"sg-start"><div style"margin-bottom: 10px">参数列表[逗号模式]<el-too…

9.23作业

仿照string类&#xff0c;自己手动实现 My_string 代码如下 MyString.h #ifndef MYSTRING_H #define MYSTRING_H #include <iostream> #include <cstring>using namespace std;class My_string { private:char *ptr; //指向字符数组的指针int size; …