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.hqwc.cn/news/623545.html

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

相关文章

Databend 开源周报第 140 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持 EXECUTE I…

项目7-音乐播放器2(上传音乐+查询音乐+拦截器)

0.加入拦截器 之后就不用对用户是否登录进行判断了 0.1 定义拦截器 0.2 注册拦截器 生效 1.上传音乐的接口设计 请求&#xff1a; { post, /music/upload {singer&#xff0c;MultipartFile file}&#xff0c; } 响应&#xff1a; { "status": 0, "message&…

访问者模式【行为模式C++】

1.概述 访问者模式是一种行为设计模式&#xff0c; 它能将算法与其所作用的对象隔离开来。 访问者模式主要解决的是数据与算法的耦合问题&#xff0c;尤其是在数据结构比较稳定&#xff0c;而算法多变的情况下。为了不污染数据本身&#xff0c;访问者会将多种算法独立归档&…

选择、插入、冒泡、计数、堆、归并、快速排序算法的Java代码汇总和GUI界面时间测试与讲解

运行效果&#xff1a; Video_2024-04-16_150519 文章目录 前言&#xff1a;排序算法在数据结构和算法中的重要性一、排序算法详解1.选择排序2.插入排序3.冒泡排序4.计数排序5.堆排序6.归并排序7.快速排序 二、实现一个可以计算时间的Java GUI排序应用程序 前言&#xff1a;排序…

【Linux】进程间通信——system V版本 共享内存

目录 共享内存 原理 实践 shmget() 创建共享内存 shmctl() 删除共享内存 shmat() 挂接进程和共享内存 shmt() 进程和共享内存去关联 共享内存的特性 优势 劣势 用共享内存实现进程间通信 共享内存 原理 两个进程的PCB各自维护着一个进程地址空间。当两个进…

ViM-UNet:用于生物医学细分的 Vision Mamba

ViM-UNet&#xff1a;用于生物医学细分的 Vision Mamba 摘要IntroductionMethod and Experiments结果与讨论 ViM-UNet: Vision Mamba for Biomedical Segmentation 摘要 卷积神经网络&#xff08;CNNs&#xff09;&#xff0c;尤其是UNet&#xff0c;是生物医学分割的默认架构…

Linux安装部署Tomcat

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Linux安装部署Tomcat //将tomcat压缩包解压到对…

Innodb之redo日志

Innodb引擎执行流程 redo log ​ MySQL中的redo log&#xff08;重做日志&#xff09;是实现WAL&#xff08;预写式日志&#xff09;技术的关键组件&#xff0c;用于确保事务的持久性和数据库的crash-safe能力。借用《孔乙己》中酒店掌柜使用粉板记录赊账的故事&#xff0c;…

小程序视频下载器

下载高手&#xff0c;让小程序视频下载变得前所未有的简单&#xff01;专为非编程专业人士设计&#xff0c;该工具免去了繁琐的抓包软件学习过程&#xff0c;无需深入研究Fiddler或Charles的配置。它优化了视频、图片和音频资源的下载&#xff0c;提供直观的操作界面&#xff0…

拉普拉斯金字塔的频谱分析

1. 基本分析 拉普拉斯金字塔分解&#xff0c;主要由以下步骤组成&#xff1a; 对输入图像 L0 进行低通滤波&#xff0c;其中常采用高斯滤波&#xff1b;对低通滤波后的图像进行 1/2 倍率的下采样&#xff0c;这里的下采样通常是指直接取偶行且偶列&#xff08;以 0 开始计&am…

创建影子用户

文章目录 1.认识影子用户2.创建隐藏账户并加入管理员组3.修改注册表3.删除用户4.添加管理员权限 1.认识影子用户 影子用户通常指的是那些在系统用户列表中不可见&#xff0c;但在某些情况下可以进行操作的用户。在内网渗透过程中&#xff0c;当我们拿到shell时&#xff0c;肯定…

微博百度热搜收集

背景 大家都有使用微博、百度吧&#xff0c;而每天的热搜想必大家也用的不少。微博、百度的热搜有7、8种分类&#xff0c;每个单独查看比较耗费时间&#xff0c;效率极低&#xff0c;大概要花费3&#xff0c;4分钟左右。最近闲来无事&#xff0c;冒出个想法&#xff0c;是不是有…