leetcode hot100_day20

4/14/2024

128.最长连续序列

自己的

        这是前两天做一半的题目了。这题给我的教训就是用哈希表的时候一定一定要考虑重复元素的问题!!!!

        这题让我想到了最长递增子序列,只是名字有点像。子序列和子数组还不一样一个连续一个不连续。自己一开始的做法是把每个元素作为key,是否被访问过作为value来存入hash表里,然后对数组元素进行遍历,访问了首先value为true,然后双指针分别标记前一个数 nums-1 和后一个数nums+1 ,分别向前和向后迭代更新,指针相减即为长度,迭代最大长度即可。

        注意boolean的布尔类型为Boolean

        一个for循环引发的错误,但是你这个方法也好慢啊。。

class Solution {public int longestConsecutive(int[] nums) {HashMap<Integer, Boolean> hash = new HashMap<>();int res = 0;for(int x : nums){hash.put(x, false);}for(int i = 0; i < nums.length; i++){// 原来的这个if条件写在了for循环的条件里// 这样不就只找了一次,if(hash.get(nums[i]) == false){//我说怎么慢,访问这个元素也要改为true,之前忘了hash.replace(nums[i], true);int low = 0;int fast = 0;int cur = nums[i];while(hash.containsKey(cur - 1)){low--;hash.replace(cur - 1, true);cur = cur - 1;}// 重置cur;// 相同元素?cur = nums[i];while(hash.containsKey(cur + 1)){fast++;hash.replace(cur + 1, true);cur = cur + 1;}int p = fast - low + 1;res = res > p ? res : p;}else continue;   }return res;}
}

官方

128. 最长连续序列 - 力扣(LeetCode)

        官方的题解写的挺好的,用的是hashSet。特别是时间复杂度后面为什么是 O(n) 的时候。

        因为每个都会被枚举

class Solution {public int longestConsecutive(int[] nums) {Set<Integer> num_set = new HashSet<Integer>();for (int num : nums) {num_set.add(num);}int longestStreak = 0;for (int num : num_set) {if (!num_set.contains(num - 1)) {int currentNum = num;int currentStreak = 1;while (num_set.contains(currentNum + 1)) {currentNum += 1;currentStreak += 1;}longestStreak = Math.max(longestStreak, currentStreak);}}return longestStreak;}
}

72.编辑距离

        求从word1转换到word2所需的最小操作次数。而操作包括:

        插入,删除,替换一个字符。也就是三种。

        看了题解,首先长度要一致,如果长度:

  1. word1 > word2,那么word1要删除字符去对标word2,也等价于word2增加字符,因为求的是次数,这两种次数是一样的。
  2. word1 < word2,那么word1要增加字符去对标word2,也等价于word2删减字符。
  3. word1 = word2, 长度匹配了。

        那么我们如何定义dp数组的含义?很巧妙的是dp[ i ][ j ]表示从word1的下标(从0开始)为 i 的单词转换为 word2 下标为 j 的单词的最小操作数。

        分类讨论,dp[ i ][ j ]从何而来?多维dp也就是二维dp吧,从周围的三个元素:

  1.  如果已知dp[ i -1 ][ j ],也就是知道了从单词1的 i -1 个字符转换到(替换为)单词2 的 j 个字符所需的次数(或者说从单词2的 j 转换为/替换成单词1的 i-1 的最小次数),这里该怎么想呢,还是看了一下题解,
  2. 如果想得到dp[i][j],也就是对于单词1的第 i 个字符,只要在单词2的前j个单词后面添加一个相同在字符,就可以得到单词1的前i个字符了。
  3. 这里不要觉得添加一个字符就是j+1了,添加只是一个操作,j代表的是当前遍历到的下标,要求的是次数。而且无论dp[i][j]是从单词1还是单词2变过来的都无所谓,因为是这个变化是等价的,次数是一定的。
  4. 可以这样理解,我就看单词2的前 j 个字符,固定住,我知道了从单词2的前 j 个字符转换到单词1的前 i -1 个字符的编辑距离/最小操作次数为dp[i-1][j],
  5. 那么从单词2的前 j 个字符转换到单词1的前 i 个字符,只需要在dp[i-1][j]的这个变化的基础上,(单词2的前 j 个字符已经转换到单词1的前 i -1 个字符)在加一次操作,在单词2的前 j 个字符后加上单词1的第i个字符。

72. 编辑距离 - 力扣(LeetCode)

class Solution {public int minDistance(String word1, String word2) {int n = word1.length();int m = word2.length();// 有一个字符串为空串if (n * m == 0) {return n + m;}// DP 数组int[][] D = new int[n + 1][m + 1];// 边界状态初始化for (int i = 0; i < n + 1; i++) {D[i][0] = i;}for (int j = 0; j < m + 1; j++) {D[0][j] = j;}// 计算所有 DP 值for (int i = 1; i < n + 1; i++) {for (int j = 1; j < m + 1; j++) {int left = D[i - 1][j] + 1;int down = D[i][j - 1] + 1;int left_down = D[i - 1][j - 1];if (word1.charAt(i - 1) != word2.charAt(j - 1)) {left_down += 1;}D[i][j] = Math.min(left, Math.min(down, left_down));}}return D[n][m];}
}

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

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

相关文章

算法练习第18天|111.二叉树的最小深度

111.二叉树的最小深度 111. 二叉树的最小深度 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/ 题目描述&#xff1a; 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最…

Unity 左右折叠显示与隐藏UI的简单实现

要实现一个简单的UI左右折叠显示与隐藏&#xff0c;可以结合遮罩&#xff0c;通过代码控制UI区块的宽度和位移来实现。 具体可以按以下步骤实现&#xff1a; 1、新建一个Image组件&#xff0c;并添加精灵&#xff0c;调整大小后&#xff0c;复制一份作为该UI的父物体&#xf…

CANoe中LIN工程主节点的配置(如何切换调度表)

1&#xff1a;前置条件 1&#xff09;工程已经建立&#xff0c;simulation窗口已经配置好&#xff08;包括且不限于通道mappin好&#xff0c;数据库文件已经添加&#xff09; 2&#xff09;我已系统自带sampleCfg工程&#xff0c;作为例子。如下图 2 &#xff1a;主节点的配置…

flutter知识点---生命周期

Flutter 应用的生命周期涉及两个层面&#xff1a;Widget&#xff08;组件&#xff09;的生命周期 和 应用程序&#xff08;App&#xff09;的生命周期。下面分别对这两个方面进行详细介绍&#xff1a; Widget&#xff08;组件&#xff09;的生命周期 Flutter 中的 Widget 是构…

边缘计算网关主要有哪些功能?-天拓四方

随着物联网&#xff08;IoT&#xff09;的快速发展和普及&#xff0c;边缘计算网关已经成为了数据处理和传输的重要枢纽。作为一种集成数据采集、协议转换、数据处理、数据聚合和远程控制等多种功能的设备&#xff0c;边缘计算网关在降低网络延迟、提高数据处理效率以及减轻云数…

基于51单片机的温度控制恒温箱设计—数码管显示

基于51单片机的温度控制恒温箱 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.DS18B20温度传感器测温&#xff1b; 2.数码管实时显示温度&#xff1b; 3.按键设置温度上下限阈值&am…

Spring Boot 统一功能处理(二)

本篇主要介绍Spring Boot统一功能处理中的统一数据返回格式。 目录 一、定义统一的返回类 二、配置统一数据格式 三、测试配置效果 四、统一格式返回的优点 五、源码角度解析String问题 一、定义统一的返回类 在我们的接口在处理请求时&#xff0c;返回的结果可以说是参…

从零开始精通RTSP之请求与响应详解2

SETUP请求与响应 SETUP主要用于准备和初始化媒体流的传输&#xff0c;客户端通过SETUP与服务器协商为特定媒体流建立传输会话的详细参数&#xff0c;包括&#xff1a;传输协议&#xff08;TCP、UDP、TLS等&#xff09;、传输模式&#xff08;单播、组播&#xff09;、端口号、R…

【CAN】采样点介绍及测试方法

文章目录 1 什么是采样点2 为什么需要采样点3 采样点的计算公式4 VH6501测试原理和方法4.1 VH6501测试采样点原理4.2 VH6501测试方法 >>返回总目录<< 1 什么是采样点 采样点是节点判断信号逻辑电平的位置&#xff0c;是CAN控制器读取总线电平&#xff0c;并解释各…

【Git教程】(十二)工作流之项目设置 — 何时使用工作流,工作流的结构,项目设置概述、执行过程及其实现 ~

Git教程 工作流之项目设置 1️⃣ 何时使用工作流2️⃣ 工作流的结构3️⃣ 概述4️⃣ 使用要求5️⃣ 执行过程及其实现5.1 基于项目目录创建一个新的版本库5.2 以文件访问的方式共享版本库5.3 用 Git daemon 来共享版本库5.4 用 HTTP 协议来共享版本库5.5 用 SSH 协议来共享版…

C++ 递归与面向对象编程基础

C 递归 递归是一种使函数调用自身的技术。这种技术提供了一种将复杂问题分解为简单问题的方法&#xff0c;从而更容易解决问题。 递归可能有点难以理解。理解其工作原理的最佳方法是通过实验来尝试。 递归示例 将两个数字相加很容易做到&#xff0c;但将一系列数字相加就更…

MySQL二阶段和三阶段提交

在分布式系统中&#xff0c;事务管理是一个至关重要的方面。MySQL作为一种常用的关系型数据库管理系统&#xff0c;提供了二阶段提交&#xff08;Two-Phase Commit&#xff0c;2PC&#xff09;和三阶段提交&#xff08;Three-Phase Commit&#xff0c;3PC&#xff09;等协议来支…

【论文阅读02】一种基于双通道的水下图像增强卷积神经网络

来源&#xff1a;海洋论坛▏一种基于双通道的水下图像增强卷积神经网络 当前不会的 一、背景&#xff1a; 水下图像增强方法包含有无水下成像模型的水下图像增强方法、基于水下成像模型的水下图像恢复方法、水下成像模型与深度学习相结合的方法以及完全采用深度学习的方…

基于Python的景区票务人脸识别系统(V2.0)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

数据结构速成--数据结构和算法

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 一…

【Linux】磁盘阵列RAID技术

目录 一、RAID介绍 1.1 什么是RAID技术&#xff1f; 1.2 为什么要使用RAID技术&#xff1f; 二、RAID级别 2.1 常见的RAID级别 2.2 常见RAID介绍 三、RAID特性对比 一、RAID介绍 1.1 什么是RAID技术&#xff1f; 把多块独立的物理磁盘按不同的方式组合起来形成一个硬盘…

Java 判空工具方法大全

引入包 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> </dependency>判断对象属性不为空 if (StringUtils.isNotBlank(params.getName())) {objectQ…

【ENSP】华为三层交换机配置AAA认证,开启telnet服务

配置步骤 1.给交换机配置ip地址&#xff0c;以便登陆 2.配置AAA&#xff0c;用户名&#xff0c;密码&#xff0c;服务类型&#xff0c;用户权限 3.配置接入设备的数量 4.开启telnet服务 LSW2交换机配置 u t m #关闭提示 sys …

基于单链表实现通讯管理系统!(有完整源码!)

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;C语言实战项目 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、前言 友友们&#xff0c;这篇文章是基于单链…

Docker in Docker简介

一&#xff0c;Docker in Docker&#xff08;简称DinD&#xff09;是一种容器化技术&#xff0c;它指的是在一个Docker容器内部运行另一个Docker实例。这种技术可以在容器化的环境中进一步封装和复用Docker操作&#xff0c;为开发、测试和部署等环节提供便利。 具体来说&#…