力扣热门算法题 56. 合并区间,57. 插入区间,58. 最后一个单词的长度v

news2024/12/23 14:00:31

56. 合并区间,57. 插入区间,58. 最后一个单词的长度,每题做详细思路梳理,配套Python&Java双语代码, 2024.03.20 可通过leetcode所有测试用例。

目录

56. 合并区间

解题思路

完整代码

Python

Java

​编辑

57. 插入区间

解题思路

完整代码

Python

Java

58. 最后一个单词的长度

解题思路

完整代码

Python

Java


56. 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

解题思路

  1. 排序:首先按照每个区间的起始位置对所有区间进行排序,这样可以保证我们在处理区间时是按照顺序来的,便于合并。
  2. 合并区间:初始化一个空的结果数组,然后遍历排序后的区间。对于每个区间,如果结果数组为空或者当前区间的起始位置大于结果数组中最后一个区间的结束位置,就直接将当前区间添加到结果数组中。否则,如果当前区间与结果数组中最后一个区间有重叠(即当前区间的起始位置小于等于结果数组中最后一个区间的结束位置),就将结果数组中最后一个区间的结束位置更新为当前区间的结束位置和结果数组中最后一个区间的结束位置中的较大者。

完整代码

Python
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:
        intervals.sort(key=lambda x: x[0])  # Step 1: Sort the intervals by their start values
        merged = []
        for interval in intervals:
            # Step 2: If the list of merged intervals is empty or if the current
            # interval does not overlap with the previous, simply append it.
            if not merged or merged[-1][1] < interval[0]:
                merged.append(interval)
            else:
                # Otherwise, there is overlap, so we merge the current and previous intervals.
                merged[-1][1] = max(merged[-1][1], interval[1])
        return merged
Java
public class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0])); // Step 1: Sort the intervals by their start values
        LinkedList<int[]> merged = new LinkedList<>();
        for (int[] interval : intervals) {
            // Step 2: If the list of merged intervals is empty or if the current
            // interval does not overlap with the previous, simply add it.
            if (merged.isEmpty() || merged.getLast()[1] < interval[0]) {
                merged.add(interval);
            } else {
                // Otherwise, there is overlap, so we merge the current and previous intervals.
                merged.getLast()[1] = Math.max(merged.getLast()[1], interval[1]);
            }
        }
        return merged.toArray(new int[merged.size()][]);
    }
}

57. 插入区间

给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。

在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。

返回插入之后的 intervals

注意 你不需要原地修改 intervals。你可以创建一个新数组然后返回它。

示例 1:

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]

示例 2:

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8][3,5],[6,7],[8,10] 重叠。

解题思路

要在已经排序且无重叠的区间列表中插入一个新的区间,并且仍然保持列表的有序性与不重叠性,可以采取以下步骤:

  1. 初始化:创建一个空的列表 result 来存储最终的区间列表。
  2. 添加新区间前的区间:遍历原始区间列表,将所有结束位置小于新区间起始位置的区间添加到 result 中,因为这些区间与新区间不重叠,并且在新区间的左侧。
  3. 合并重叠区间:继续遍历,对于每个与新区间重叠的区间(即区间的起始位置小于等于新区间的结束位置),更新新区间的起始和结束位置,使其扩展到包括当前区间。这一步可能会通过多次迭代来合并多个重叠的区间。
  4. 添加合并后的新区间:将更新后的新区间添加到 result 中。
  5. 添加新区间后的区间:最后,将所有起始位置大于新区间结束位置的区间添加到 result 中,因为这些区间与新区间不重叠,并且在新区间的右侧。

完整代码

Python
class Solution:
    def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
        result, i = [], 0
        # Step 2: Add all intervals before the newInterval
        while i < len(intervals) and intervals[i][1] < newInterval[0]:
            result.append(intervals[i])
            i += 1
        
        # Step 3: Merge all overlapping intervals to one considering newInterval
        while i < len(intervals) and intervals[i][0] <= newInterval[1]:
            newInterval[0] = min(newInterval[0], intervals[i][0])
            newInterval[1] = max(newInterval[1], intervals[i][1])
            i += 1
        result.append(newInterval)  # Step 4: Add the merged interval
        
        # Step 5: Add the rest of the intervals
        while i < len(intervals):
            result.append(intervals[i])
            i += 1
        
        return result
Java
public class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        List<int[]> result = new ArrayList<>();
        int i = 0;
        // Step 2: Add all intervals before the newInterval
        while (i < intervals.length && intervals[i][1] < newInterval[0]) {
            result.add(intervals[i]);
            i++;
        }
        
        // Step 3: Merge all overlapping intervals to one considering newInterval
        while (i < intervals.length && intervals[i][0] <= newInterval[1]) {
            newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
            newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
            i++;
        }
        result.add(newInterval);  // Step 4: Add the merged interval
        
        // Step 5: Add the rest of the intervals
        while (i < intervals.length) {
            result.add(intervals[i]);
            i++;
        }
        
        return result.toArray(new int[result.size()][]);
    }
}

58. 最后一个单词的长度

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大

子字符串

示例 1:

输入:s = "Hello World"
输出:5
解释:最后一个单词是“World”,长度为5。

示例 2:

输入:s = "   fly me   to   the moon  "
输出:4
解释:最后一个单词是“moon”,长度为4。

示例 3:

输入:s = "luffy is still joyboy"
输出:6
解释:最后一个单词是长度为6的“joyboy”。

解题思路

  1. 去除尾部空格:首先,我们需要从字符串的尾部开始去除所有的空格,以确保当我们从字符串末尾开始查找单词时,不会被尾部的空格干扰。
  2. 查找最后一个单词:在去除尾部空格后,我们从字符串的最后一个字符开始向前遍历,直到遇到空格或到达字符串的开头。这个过程中遍历的字符数量就是最后一个单词的长度。

完整代码

Python
class Solution:
    def lengthOfLastWord(self, s: str) -> int:
        length = 0
        # Step 1: Trim the trailing spaces
        index = len(s) - 1
        while index >= 0 and s[index] == ' ':
            index -= 1
        
        # Step 2: Count the length of the last word
        while index >= 0 and s[index] != ' ':
            length += 1
            index -= 1
        
        return length
Java
public class Solution {
    public int lengthOfLastWord(String s) {
        int length = 0;
        int index = s.length() - 1;
        
        // Step 1: Trim the trailing spaces
        while (index >= 0 && s.charAt(index) == ' ') {
            index--;
        }
        
        // Step 2: Count the length of the last word
        while (index >= 0 && s.charAt(index) != ' ') {
            length++;
            index--;
        }
        
        return length;
    }
}

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

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

相关文章

【NLP笔记】预训练+微调范式之OpenAI Transformer、ELMo、ULM-FiT、Bert..

文章目录 OpenAI TransformerELMoULM-FiTBert基础结构Embedding预训练&微调 【原文链接】&#xff1a; BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 【本文参考链接】 The Illustrated BERT, ELMo, and co. (How NLP Cracked Tra…

ASP.NET-Global.asax使用详解

本文介绍了如何使用Global.asax文件来增强ASP.NET Web应用程序的功能。首先&#xff0c;介绍了Global.asax文件的作用和基本功能。接着&#xff0c;详细探讨了在Global.asax中实现定时任务、应用程序级别的错误处理、应用程序启动和结束时执行特定逻辑等功能。随后&#xff0c;…

Macbook m1安装docker详细教程

下载安装包 进入官网 https://www.docker.com/ 下滑找到下载位置 下滑找到Mac对应安装包 等待下载完成即可。 安装 双击打开下载的安装包 将Docker拖到Applications中 安装完成后&#xff0c;找到安装的Docker 双击打开 点击accept同意 进入下面&#xff1a; 点fini…

Chart-based Reasoning: Transferring Capabilities from LLMs to VLMs

Chart-based Reasoning: Transferring Capabilities from LLMs to VLMs 相关链接&#xff1a;arXiv 关键字&#xff1a;Vision-language models、ChartQA、multimodal reasoning、fine-tuning、synthetic data 摘要 本文提出了一种技术&#xff0c;将大型语言模型&#xff08;…

Python分析人民日报关于台湾的报道

【项目背景】 《人民日报》数据挖掘&#xff0c;时间&#xff1a;1949.10.1-2023.12.31 标题含有“台湾”的报道 需要以下内容 1、标题&#xff0c;即上述时间段的报道标题和相应的报道时间、版面 2、包含标题、时间、版面的所有报道内容 3、报道的年份和数量的趋势图 4、…

CV论文--2024.3.21

1、Chain-of-Spot: Interactive Reasoning Improves Large Vision-Language Models 中文标题&#xff1a;Chain-of-Spot&#xff1a;交互式推理改进大型视觉语言模型 简介&#xff1a;在视觉语言理解领域&#xff0c;模型在解释和推理视觉内容方面的熟练程度已经成为许多应用的…

企业组织机构代码查询入口词令直达关键词口令是什么?

什么是企业组织机构代码&#xff1f; 组织机构代码是国内依法注册、依法登记的机关、企事业单位、社会团体&#xff0c;以及其他组织机构颁发一个在全国范围内唯一的、始终不变的代码标识。组织机构代码在单位的运营和管理中发挥着重要作用。 如何查询获取企业组织机构代码&a…

【机器学习】基于萤火虫算法优化的BP神经网络分类预测(FA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】萤火虫算法&#xff08;FA&#xff09;原理及实现 2.设计与实现 数据集&#xff1a; 多输入多输出&#xff1a;样本特征24&#xff0c;标签类别4。…

一些常见漏洞原理

一些漏洞的原理&#xff1a; SQL注入漏洞&#xff1a; SQL注入漏洞主要形成的原因是在数据交互中&#xff0c;前端的数据传入到后台处理时&#xff0c;没有做严格的判断&#xff0c;导致其传入的“数据”拼接到SQL语句中后&#xff0c;被当作SQL语句的一部分执行。 从而导致数…

day65 分层实现商品管理系统

分层实现商品管理系统 事务的特点&#xff0c;隔离级别的分类 在java中如何实现事务的操作 商品信息&#xff1a; 在goods表中作为子表引用class主表的主键作为goods表的外键 有对应主外键关联时也就是n对1的关系时 在使用jdbc技术时goods类对象要包含class类对象作为goods对…

从浏览器地址栏输入 URL 到请求返回发生了什么?

从浏览器地址栏输入 URL 到请求返回发生了什么&#xff1f; 从浏览器地址栏输入 URL 到请求返回发生了什么&#xff1f;简略的答案什么是 URL&#xff1f;DNS域名解析TCP建立连接&#xff1a;三次握手发送HTTP请求消息结构请求报文请求行请求头请求体 响应报文响应行响应头响应…

Vue 计算属性和watch监听

1.1.计算属性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- 引入vue.js --><script src"node_modules/vue/dist/vue.js"></script> </h…

LeetCode 刷题 --- 快速幂

前言&#xff1a; 幂运算是一种常见的运算&#xff0c;求取a^n,最容易想到的方法便是通过循环逐个累乘&#xff0c;其复杂度为O(n)&#xff0c;这在很多时候是不够快的&#xff0c;所以我们需要一种算法来优化幂运算的过程。 快速幂&#xff0c;二进制取幂&#xff08;Binary…

【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结

【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结 模糊图像增强技术之去噪声类滤波场景应用小结—【蘇小沐】 文章目录 【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结&#xff08;一&#xff09;去噪声类滤波器1、去块滤波器&#xff08;Deblo…

基于Vue.js和D3.js的智能停车可视化系统

引言 随着物联网技术的发展&#xff0c;智能停车系统正逐渐普及。前端作为用户交互的主要界面&#xff0c;对于提供直观、实时的停车信息至关重要。 目录 引言 一、系统设计 二、代码实现 1. 环境准备 首先&#xff0c;确保您的开发环境已经安装了Node.js和npm。然后&…

Qt 多元素控件

Qt开发 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别 以 QTableWidget 和 QTableView 为例. QTableView 是基于 MVC 设计的控件. QTableView 自身不持有数据. 使用QTableView 的 …

Prometheus 配置Basic auth认证

官方配置说明&#xff1a; Basic auth | Prometheus 一、生成密码加密串 Prometheus于2.24版本&#xff08;包括2.24&#xff09;之后提供Basic Auth功能进行加密访问&#xff0c;在浏览器登录UI的时候需要输入用户密码&#xff0c;访问Prometheus api的时候也需要加上用户密…

Qt 鼠标滚轮示例

1.声明 void wheelEvent(QWheelEvent *event) override;2.实现&#xff08;方便复制、测试起见用静态变量&#xff09; #include <mutex> void MainWindow::wheelEvent(QWheelEvent *event) {static QLabel *label new QLabel("Zoom Level: 100%", this);st…

Cesium for UE-01-虚幻引擎的下载安装及插件配置

学习Cesium for UE的过程笔记 下载UE 下载 下载完成后&#xff0c;点击运行&#xff0c;执行安装 安装完成后需要下载epic game 下载完成&#xff0c;需要登录 没有账号的自行注册&#xff0c;或者选一个有账号的平台登录即可 选择虚幻引擎&#xff0c;再点击库 可以看到下…

Cronos zkEVM 基于 Covalent Network(CQT)数据可用性 API,推动其 Layer2 DeFi 生态更好地发展

在一项旨在显著改善 DeFi 生态的战略举措中&#xff0c;Cronos 与 Covalent Network&#xff08;CQT&#xff09;携手合作&#xff0c;以期待 Cronos zkEVM 的推出。这一整合&#xff0c;预计将进一步降低以太坊生态系统的交易成本、提升交易速度&#xff0c;并带来更好的交易体…