面试常用算法归纳

news2024/11/13 10:08:48

最长子串、子序列

先说明下子串和子序列的问题:对于s = “pwwkew"来说,其中一个子串为"wke”,而"pwke" 是一个子序列。
子序列:一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
对于求最长子串、最长序列的问题:
基本上需要用到动态规划的dp数组来辅助。主要原因是,如果暴力求各个子串或者序列的话,算数量太大,容易超时。
在使用dp数组时,有两种类型,一种是一维的dp数组,一种是二维的dp数组。

一维dp

对于一个字符串或者数组中求最大值时,一般考虑一维的dp数组,并且对于其定义为dp[i]表示为从S[0]到S[i]间符合题意的最大值。但如果用这个定义会导致转移状态方程不好推导,dp[i]和dp[i-1]中间有断层,则需要考虑更改dp[i]的定义。可以考虑把dp[i]表示为以S[i]为结尾的子串或者子数组的符合题意的最大值,比如力扣如下题:

有断层

对于有断层的,一般都要在推导dp[i]时,需要在0 ~ i -1间找到一个最大的,来推导dp[i]。

最长递增子序列

在这里插入图片描述
对于dp数组的定义:
这个题是有断层的。如果把dp[i]定义为,nums[0 … i]子数组中的最长递增子序列的长度,那么当第i个元素要加入时,就会出现问题,如下图所示,当前nums[i]不好去找dp[i-1]的元素去比较,从而推导出dp[i]。此时需要更换对于dp[i]的定义。
在这里插入图片描述
当我们把dp[i]定义为:以nums[i]为结尾的子数组的最长递增子序列的长度。那么断层就不会出现,dp[i-1]中的子数组,永远会包含nums[i-1]自己。如下图:
在这里插入图片描述
那么我们就在比较dp[i]和dp[i-1]的大小,就能推导出dp[i]的值。也需要一种逆向思维,从转移公式开始去推导对dp[i]定义的修改。
对于dp数组的转移公式:
当我们要求dp[i]时,即需要把nums[i]插入进去。那么它应该在哪个位置比较合适呢?
这里最关键,如果不加思考,可能会觉得如果nums[i] > nums[i - 1]的话,就让dp[i] = dp[i -1] + 1。这里有个问题,就是原nums数组并不是有序的,你不能确保dp[i -1]就是dp[0] ~ dp[i -1]里头最大的那个啊!nums[i] < nums[i - 1]时的操作也一样。
最直观的方式就是,从i-1往前找,找到一个nums[j]小于等于nums[i]的,并且dp[j]是当中最大的,这样就可以推导出dp[i]了,因为dp[i]一定包含自己,那是否要包含[0 ~ i-1]中的元素,那就得去找到一个满足值小于自己的,并且dp又是最大的来计算。
另外,这里找到这么一个j后,还要看nums[j]是否与nums[i],相等,如果相等,那么dp[i] = dp[j];不相等(肯定是小于nums[i]的),则dp[i] = dp[j] + 1。

最大子数组和

在这里插入图片描述
对于dp[i]的定义为:以nums[i]为结尾的「最大子数组和」

无重复字符的最长子串

在这里插入图片描述
如果定义dp[i]为:s[0 … i]的【无重复字符的最长子串】的长度,那么就会有断层,我并不知道dp[i - 1]表示的那个满足题意的连续子串的位置在哪里,这样我也不好去推导dp[i]出来。如下图:
在这里插入图片描述
所以必须针对这个断层,修改定义。对于dp[i]的定义为:以s[i]为结尾的【无重复字符的最长子串】的长度。
在推导dp[i]时,需要去检测从start开始到i-1,处是否有nums[i]这个元素,对于dp[i]的值应该是从i-1开始到第一个出现nums[i]元素间的距离。
在这里插入图片描述
注意:这里需要使用一个pair<int, int>记录前一个dp[i]的最长子串的始末位置,在判断s[i]与s[i-1]不等时,需要继续往前判断s[i]是否包含在前一个dp[i-1]的子串中,如果在,则当前的dp[i]需要减去dp[i-1]子串的前一部分。

买卖股票的最佳时机在这里插入图片描述

  • 定义推导
    这里如果定义dp[i]为[0 … i]里最大收益,那么同样是会出现断层,即买卖点不知道在哪里。这个时候我们一定要确定一个卖点时间。那么自然会把dp[i]定义为:第i天卖出股票能获得的最大收益。
  • 状态转移方程推导:
    这里如果按照前面的方式会进入一个误区,就是dp[i]由dp[i-1]来计算出来。但是你并不知道dp[i-1]是在哪天买入的。这里有一个非常重点的东西就是,收益最大,那么一定要买入价格最低,反正我都必须在第i天卖出。那就扫描数组的时候记录下[0 ~ i-1]区间里的最小值即可。
    dp[i] = prices[i] - minPrices; 再注意更新下minPrices即可。

二维dp

如果涉及到两个字符串或者数组的,基本上需要用到二维dp数组。对于二维dp的状态转移方程,大致都会是要从左、上及左上三个方向来推导,即:dp[i][j] = max(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])。

    1. 最长公共子序列
      在这里插入图片描述
      这里对于dp的定义需要使用到二维数组,因为这里涉及到两个字符串。
      定义dp[i][j]为:s1[0…i-1]及s2[0…j-1]两个字符串的【最长公共子序列】的长度。
      dp[0][x]/dp[x][0]表示其中有一个是空字符串,那它们的最长公共子序列的长度自然为0;
      转移方程:dp[i][j] = max(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])
    1. 最长回文子序列
      在这里插入图片描述
      定义dp[i][j]为:s[i … j]之间的最长回文子序列的长度。
      那么dp[i][j]要从dp[i+1][j-1]、dp[i][j-1]、dp[i+1][j]三者中取出。
      当s[i] == s[j]时,比较简单,显然dp[i][j] = d[i+1][j-1] + 2
      当s[i] != s[j]时,说明s[i]和s[j]不能同时出现在s[i…j]的最长回文子序列中。那么就只能在s[i]或者s[j]中取一个去加入到上一个回文子序列中,形成新的回文子序列。即dp[i][j] = max(dp[i][j-1], dp[i+1][j])

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

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

相关文章

基于Matlab通用视频处理系统的设计-含Matlab代码

⭕⭕ 目 录 ⭕⭕⏩ 一、引言⏩ 二、系统总体方案设计⏩ 2.1 方案设计⏩ 2.2 界面设计⏩ 三、实例分析⏩ 四、参考文献⏩ 五、Matlab程序获取⏩ 一、引言 随着信息技术的发展&#xff0c;基于视频图像中对感兴趣的目标提取&#xff0c;已经逐渐渗透到人们生活的方方面面&#x…

[附源码]SSM计算机毕业设计“拥抱爱心”公益网站管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

VMware Workstation 与 Device/Credential Guard 不兼容问题

系列文章目录 VMware Workstation 与 Device/Credential Guard 不兼容问题 VMware Workstation 与 Device/Credential Guard 不兼容问题系列文章目录一、原因二、解决办法2.1修改虚拟化安全设备为禁用2.2HV主机服务启动类型设置 为 “禁用”2.3关闭 Hyper-V 并且打开虚拟机平台…

CUDA By Example(六)——纹理内存

在本章中&#xff0c;我们将学习如何分配和使用纹理内存(Texture Memory)。和常量内存一样&#xff0c;纹理内存是另一种类型的只读内存&#xff0c;在特定的访问模式中&#xff0c;纹理内存同样能够提升性能并减少内存流量。虽然纹理内存最初是针对传统的图形处理应用程序而设…

Linux学习-43-挂载Linux系统外的文件mount和卸载文件系统umount命令用法

10.10 mount命令详解&#xff1a;挂载Linux系统外的文件 所有的硬件设备必须挂载之后才能使用&#xff08;新硬盘先格式化后创建分区&#xff0c;再对分区进行挂载&#xff09;&#xff0c;只不过&#xff0c;有些硬件设备&#xff08;比如硬盘分区&#xff09;在每次系统启动…

记录一次我虚拟机好不容易连上后的配置

有一说一&#xff0c;看到这个响应&#xff0c;人都麻了 在此我记录一下我检查了哪些&#xff0c;做了哪些 一、Windows本地服务 这一块&#xff0c;有一个算一个&#xff0c;没起的启动&#xff0c;启动的重启 二、VMware的虚拟网络编辑器设置 因为我这次成功用的是NAT模式&a…

图像分割 - 阈值处理 - 多阈值处理(OTSU)

目录 1. 多阈值处理介绍 2. 代码讲解 3. 完整代码 1. 多阈值处理介绍 之前介绍的都是全局单个阈值对图像的分割。固定阈值法&#xff0c;阈值是人工根据灰度直方图的波谷进行设置的。全局阈值法&#xff0c;根据不停的迭代两个区域间的平均灰度进行分割。OUST最大类间方差法…

centos7 环境安装 PM2 管理 node

前言&#xff1a; 由于最新的项目中用到的框架是 ssr 框架。 Vue使用的ssr是 nuxt.js&#xff0c;由于 nuxt.js 和普通的Vue项目不同&#xff0c;所以部署到Linux服务器的方式和普通的Vue项目是有区别的。 1、PM2 介绍 PM2 是一款非常优秀的 Node 进程管理工具&#xff0c;它…

用于科学研究的TCO反式环辛烯:1312010-03-9,(4E)-TCO-CycP-O-PNB ester

(4E)-TCO-CycP-O-PNB ester物理数据&#xff1a; CAS&#xff1a;1312010-03-9| 中文名&#xff1a;(4E)-反式环辛烯-CycP-O-PNB ester&#xff0c; (4E)-反式环辛烯-CYCP-O-PNB-酯 | 英文名&#xff1a;(4E)-TCO-CycP-O-PNB ester 结构式&#xff1a; 英文别名&#xff1a; …

试用信号灯实现如图所示的进程同步关系

试用信号灯实现如图所示的进程同步关系 信号量的个数要等于具有直接前驱的进程个数 P2,P3,P4,P5这些进程有前驱&#xff0c;所以设S2S3S4S50 因为P1执行完&#xff0c;P2,P3,P4才能执行因为P1没有直接前驱&#xff0c;所以直接释放P2.P3.P4的信号量S2,S3,S4P1{V(S2)V(S3)V(…

03-HTML

1 HTML入门 1.1 初识HTML 1.1.1 概述 网络世界已经跟我们息息相关&#xff0c;当我们打开一个网站&#xff0c;首先映入眼帘的就是一个个华丽多彩的网页。这些网页&#xff0c;不仅呈现着基本的内容&#xff0c;还具备优雅的布局和丰富的动态效果&#xff0c;这一切都是如何…

图像分割简介

相比于目标检测只是将目标位置检测出来而言&#xff0c;目标分割能够更精准的将图像进行划分。图像分割在计算机视觉中的地位 为后续检测、识别等提供技术支持。 图像分割难点以及处理 难点&#xff1a;图像特征的组合难以表达&#xff1f; 比如 图中人的头发和裤子是黑色&a…

《FFmpeg Basics》中文版-10-为视频添加文字

正文 视频中包含的文本数据可以显着提高其信息质量。 在视频中添加文字的相关介绍 如何将一些文本添加到视频输出中的两种常用方法是使用前一章中的字幕或叠加技术(overlay)。 具有许多可能性的最高级选项是使用表中描述的抽象滤镜&#xff1a; 描述从文本文件或字符串在视频…

成像雷达量产突破:木牛携手全球合作伙伴突破智驾瓶颈

时隔三年的全球工程机械行业大展&#xff0c;第33届2022德国慕尼黑Bauma展&#xff0c;于近期圆满收官。作为2022年为数不多的全球性展会&#xff0c;吸引了60多个国家和地区的3100余家工程机械企业聚首&#xff0c;行业新品竞相角逐&#xff0c;数字智能化的创新产品成为本次展…

最近公共祖先(lca)

题目描述 如题&#xff0c;给定一棵有根多叉树&#xff0c;请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N,M,S&#xff0c;分别表示树的结点个数、询问的个数和树根结点的序号。 接下来 N−1 行每行包含两个正整数 x,y&#xff0c;表示 x 结点和 y 结…

[附源码]java毕业设计景区门票系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

C# 通过字符串找对应名称的变量、Winform跨容器调用变量、递归遍历XML

C# 通过字符串找对应名称的变量、Winform跨容器调用变量、递归遍历XML 通过字符串&#xff0c;找对应名称的变量 ExceptionRecord er new ExceptionRecord();//新建类的对象&#xff08;变量在这个类中&#xff09; var fieldInfo er.GetType().GetField("Params"…

《Google软件工程之道》软件工程随想

写在之前&#xff1a;今年年初给自己安排了任务&#xff0c;每个月写一遍感悟性的文章。促使自己沉淀并思考。 这篇文章的内容本来只是一些想法&#xff0c; 想想还是记下来。几年以后自己再读这篇文章也许是另一种体会吧 编程和软件工程之间有三个关键的区别&#xff1a;时间、…

基于遗传算法的自主式水下潜器路径规划问题(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

2022/11/18拓展班上机课

Vs的使用 新建项目 新建源文件 关闭scanf_s和printf_s检查&#xff1a;project -> 属性 -> C/C -> 常规 ->SDL&#xff1a;否 char* str"..."出现”"const char *" 类型的值不能用于初始化 "char *" 类型的实体“错误&#xff…