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];
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实验案例二:配置路由器实现互通

一.实验环境 实验用具包括两台路由器&#xff08;或交换机)&#xff0e;一根双绞线缆&#xff0c;一台PC&#xff0c;一条Console线缆。 二.需求描述 如图6.14所示&#xff0c;将两台路由器的Gig0/0接口相连&#xff0c;通过一台PC连接设备的Console端口并配置IP地址&#x…

健身管理小程序|基于微信开发健身管理小程序的系统设计与实现(源码+数据库+文档)

健身管理小程序目录 基于微信开发健身管理小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 小程序端&#xff1a; 后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码…

【重磅更新】开源表单系统填鸭表单v5版发布!

亲爱的TDucker&#xff0c;你们好。 真诚感谢您对填鸭表单的关注与支持。今天我们将为您带来新版本的更新说明&#xff0c;以便您更好的使用我们的产品。 社区版版V5更新概览&#xff1a; ✅ 增加WebHook数据推送功能&#xff0c;集成TReport实现数据大屏展示。 ✅ 增加主题…

在linux上面安装xxl-job2.4.0

问题 由于预算有限&#xff0c;用不起lambda去跑定时任务&#xff0c;现在只能在EC2上面自己安装一个单机版的xxl-job了。 步骤 下载压缩包 在这个页面下载压缩包&#xff0c;并本地解压。 https://github.com/xuxueli/xxl-job/releases mysql准备 找到它默认身数据库初始…

AI决策与专家决策,您更喜欢哪种决策方式?

HI&#xff0c;我是AI智能小助手CoCo。 CoCode开发云智能助手CoCo “大家好&#xff0c;我是CoCode开发云的AI智能小助手CoCo&#xff0c;现在为大家播放关于CoCode开发云AI大家庭的最新消息&#xff1a; 欢迎AI家庭新成员&#xff1a;AI自动决策”。 AI自动决策发布 CoCode开…

零基础自学Python,啃透这五本书就够了!

选择合适的学习资源 在自学Python的前期&#xff0c;选择一本适合初学者的Python入门书籍或在线教程&#xff0c;从基础开始学习&#xff0c;好的入门书籍或在线教程会按照逻辑顺序组织知识&#xff0c;从基础概念开始&#xff0c;逐步引导你深入学习Python编程语言。这种系统…

【经典算法】LeetCode 136:只出现一次的数字(Java/C/Python3实现含注释说明,Easy)

个人主页&#xff1a; 进朱者赤 阿里非典型程序员一枚 &#xff0c;记录平平无奇程序员在大厂的打怪升级之路。 一起学习Java、大数据、数据结构算法&#xff08;公众号同名&#xff09; 目录 题目描述思路及实现方式一&#xff1a;使用异或运算&#xff08;推荐&#xff09;思…

MGRE环境下的ospf实验

MGRE环境下的ospf实验 一.拓扑图 二.实验步骤 1.分配各路由网段IP [R1]int g 0/0/0 [R1-GigabitEthernet0/0/0]ip address 16.0.0.1 24 [R1-GigabitEthernet0/0/0]int g 0/0/1 [R1-GigabitEthernet0/0/1]ip address 116.0.0.1 24[R2]int g 0/0/0 [R2-GigabitEthernet0/0/0]…

PDF文档电子签名怎么做?

如何确保电子文档的签署具有公信力和法律效力&#xff0c;防止伪造和假冒签名等问题&#xff0c;是电子文档无纸化应用面临的重要挑战。本文将详细介绍PDF文档电子签名的概念、重要性、实施步骤以及相关的法律背景&#xff0c;帮助用户理解并有效应用PDF文档电子签名技术。 1.…

扫雷 【搜索,哈希】

9.扫雷 - 蓝桥云课 (lanqiao.cn) #include<bits/stdc.h> using namespace std; #define int long long const int N1e5100; int n,m,res0; struct pt{int x,y,r; }; typedef pair<int,int> pii; map <pii,int> a;//炸雷的map,键是x,y,值是r map <pii,int&…

Databend 开源周报第 140 期

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

FebHost:瑞士.CH域名和.RE域名如何选择

.ch和.re域名的区别主要在于它们代表的地区不同。.ch是瑞士的顶级域名&#xff0c;代表着瑞士的精细、创新和可靠&#xff1b;而.re则是留尼汪岛的顶级域名&#xff0c;展示着留尼汪岛的多元化和温馨。 从历史角度看&#xff0c;.ch域名的历史更悠久&#xff0c;反映了瑞士长久…

JSON数据格式讲解与cJSON库的使用

文章目录 写在前面一、安装cJSON二、使用cJSON1、使用的文件2、如何传输数据&#xff1a;**** 三、JSON语法四、cJSON函数讲解1、cJSON结构体 **2、cJSON结构体与字符串之间的转换&#xff08;重要&#xff09;2.1、标题将cJSON结构体转换为字符串(常用)2.2、将字符串转为cJSON…

什么是并行通信、串行通信?什么是全双工、半双工、单工? 什么是异步通信、同步通信? 什么是RS232、RS485?什么是pwm?

什么是并行通信、串行通信&#xff1f; 嵌入式系统中的通信是指两个或两个以上的主机之间的数据互交&#xff0c;这里的主机可以是计算机也可以是嵌入式主机&#xff0c;甚至可以是芯片。主机间通信的方式一般可以分为两类&#xff1a;并行通信和串行通信。并行通信是指多个比特…

LlamaIndex 组件 - Loading

文章目录 一、概览加载Transformations将所有内容放在一起抽象 二、文档/节点概览1、概念2、使用模式文件节点 三、定义和定制文档1、定义文档2、自定义文档2.1 元数据2.2 自定义id2.3 高级 - 元数据定制1&#xff09;自定义LLM元数据文本2&#xff09;自定义嵌入元数据文本3&a…

华为配置静态ARP示例

华为配置静态ARP示例 组网图形 图1 配置静态ARP组网图 静态ARP简介配置注意事项组网需求配置思路操作步骤配置文件相关信息 静态ARP简介 静态ARP表项是指网络管理员手工建立IP地址和MAC地址之间固定的映射关系。 正常情况下网络中设备可以通过ARP协议进行ARP表项的动态学习&…

Linux --- 高级IO

目录 1. 什么是IO 2. 阻塞的本质 3. 五种IO模型 3.1. 通过故事认识五种IO模型 3.2. 上述故事的总结 3.3. 具体的五种IO模型 3.3.1. 阻塞IO 3.3.2. 非阻塞轮询式IO 3.3.3. 信号驱动IO 3.3.4. 多路转接IO 3.3.5. 异步IO 4. 非阻塞IO 4.1. fcntl 系统调用 1. 什么是I…

麒麟信安LTF框架上线openEuler社区

麒麟信安LTF框架介绍 LTF&#xff08;Linux Test Framework&#xff09;是麒麟信安自动化组开发的一款面向Linux操作系统测试的自动化测试框架&#xff0c;目前已在openEuler社区开源。LTF工具积极投入国内各评测项目和日常版本测试任务中&#xff0c;汲取了在Linux自动化测试…

C语言预处理操作详解

这篇博客和大家分享一下C语言中的预处理操作。 1. 预定义符号 C语言设置了⼀些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATA__ //文件被编译的日期 __TIME_…

【Android】重温Activity生命周期

前言 Android中用得最多的组件是Activity&#xff0c;而它的生命周期也是最基础的知识&#xff0c;从刚接触Android到工作中会频繁依赖这部分知识。可能大多数人能说出页面新建到页面关闭会走的生命周期&#xff1a;onCreate、onStart、onResume、onPause、onStop、onDestory&…