【LeetCode算法系列题解】第56~60题

news2024/9/19 10:39:53

CONTENTS

    • LeetCode 56. 合并区间(中等)
    • LeetCode 57. 插入区间(中等)
    • LeetCode 58. 最后一个单词的长度(简单)
    • LeetCode 59. 螺旋矩阵 II(中等)
    • LeetCode 60. 第k个排列(困难)

LeetCode 56. 合并区间(中等)

【题目描述】

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

【示例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 ≤ i n t e r v a l s . l e n g t h ≤ 1 0 4 1\le intervals.length\le 10^4 1intervals.length104
i n t e r v a l s [ i ] . l e n g t h = = 2 intervals[i].length == 2 intervals[i].length==2
0 ≤ s t a r t i ≤ e n d i ≤ 1 0 4 0\le start_i\le end_i\le 10^4 0startiendi104

【分析】


区间合并模板题,是一个贪心问题,先将所有区间按左端点排序,然后遍历每个区间,并记录每个新区间的左右端点 l , r l,r l,r,若当前区间 i i i 的左端点不在 [ l , r ] [l,r] [l,r] 中,说明已经没办法合并了, [ l , r ] [l,r] [l,r] 就是一个新区间,将其记录下来,然后将 l , r l,r l,r 更新成当前区间的左右端点;若当前区间 i i i 的左端点在 [ l , r ] [l,r] [l,r] 中,那么新区间的右端点可能会更新,即 r = max(r, intervals[i][1])


【代码】

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> res;
        sort(intervals.begin(), intervals.end());
        int l = intervals[0][0], r = intervals[0][1];
        for (int i = 1; i < intervals.size(); i++)
            if (intervals[i][0] > r)
            {
                res.push_back({ l, r });
                l = intervals[i][0], r = intervals[i][1];
            }
            else r = max(r, intervals[i][1]);
        res.push_back({ l, r });  // 注意别忘了最后一段
        return res;
    }
};

LeetCode 57. 插入区间(中等)

【题目描述】

给你一个无重叠的,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

【示例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] 重叠。

【示例3】

输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]

【提示】

1 ≤ i n t e r v a l s . l e n g t h ≤ 1 0 4 1\le intervals.length\le 10^4 1intervals.length104
i n t e r v a l s [ i ] . l e n g t h = = 2 intervals[i].length == 2 intervals[i].length==2
0 ≤ i n t e r v a l s [ i ] [ 0 ] ≤ i n t e r v a l s [ i ] [ 1 ] ≤ 1 0 5 0\le intervals[i][0]\le intervals[i][1]\le 10^5 0intervals[i][0]intervals[i][1]105
intervals 根据 intervals[i][0] 按升序排列
n e w I n t e r v a l . l e n g t h = = 2 newInterval.length == 2 newInterval.length==2
0 ≤ n e w I n t e r v a l [ 0 ] ≤ n e w I n t e r v a l [ 1 ] ≤ 1 0 5 0\le newInterval[0]\le newInterval[1]\le 10^5 0newInterval[0]newInterval[1]105

【分析】


如果 intervals[i][1] < newInterval[0],说明区间完全在 newInterval 的左边,没有交集;如果 intervals[i][1] >= newInterval[0] && intervals[i][0] <= newInterval[1],说明有重叠部分,需要进行合并区间的操作;如果 intervals[i][0] > newInterval[1],说明区间完全在 newInterval 的右边,没有交集。


【代码】

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& a, vector<int>& b) {
        vector<vector<int>> res;
        int k = 0;
        while (k < a.size() && a[k][1] < b[0]) res.push_back(a[k++]);
        while (k < a.size() && a[k][1] >= b[0] && a[k][0] <= b[1])
            b[0] = min(b[0], a[k][0]), b[1] = max(b[1], a[k][1]), k++;
        res.push_back(b);
        while (k < a.size()) res.push_back(a[k++]);
        return res;
    }
};

LeetCode 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 ≤ s . l e n g t h ≤ 1 0 4 1\le s.length\le 10^4 1s.length104
s 仅有英文字母和空格 ' ' 组成
s 中至少存在一个单词

【分析】


本题有很多种做法,可以使用 Python 的 split 函数过滤掉空格;也可以使用 C++ 的 stringstream 不断读入字符串,读入的过程会自动过滤空格;还可以用双指针从后往前遍历找出第一个单词。


【代码】

【Python代码】

class Solution:
    def lengthOfLastWord(self, s: str) -> int:
        return len(s.split()[-1])

【C++ StringStream代码】

class Solution {
public:
    int lengthOfLastWord(string s) {
        stringstream ssin(s);
        string res;
        while (ssin >> res);
        return res.size();
    }
};

【手动实现】

class Solution {
public:
    int lengthOfLastWord(string s) {
        int i = s.size() - 1;
        while (i >= 0 && s[i] == ' ') i--;
        int j = i - 1;
        while (j >= 0 && s[j] != ' ') j--;
        return i - j;
    }
};

LeetCode 59. 螺旋矩阵 II(中等)

【题目描述】

给你一个正整数 n,生成一个包含 1 1 1 n 2 n^2 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

【示例1】

在这里插入图片描述

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

【示例2】

输入:n = 1
输出:[[1]]

【提示】

1 ≤ n ≤ 20 1\le n\le 20 1n20

【分析】


和第54题一样,定义四个方向向量后模拟填入每个数即可。


【代码】

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n));
        int dx[] = { 0, 1, 0, -1 }, dy[] = { 1, 0, -1, 0 };
        for (int i = 1, x = 0, y = 0, d = 0; i <= n * n; i++)
        {
            res[x][y] = i;
            int nx = x + dx[d], ny = y + dy[d];
            if (nx < 0 || nx >= n || ny < 0 || ny >= n || res[nx][ny]) d = (d + 1) % 4;
            x += dx[d], y += dy[d];
        }
        return res;
    }
};

LeetCode 60. 第k个排列(困难)

【题目描述】

给出集合 [1,2,3,...,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

  • "123"
  • "132"
  • "213"
  • "231"
  • "312"
  • "321"

给定 nk,返回第 k 个排列。

【示例1】

输入:n = 3, k = 3
输出:"213"

【示例2】

输入:n = 4, k = 9
输出:"2314"

【示例3】

输入:n = 3, k = 1
输出:"123"

【提示】

1 ≤ n ≤ 9 1\le n\le 9 1n9
1 ≤ k ≤ n ! 1\le k\le n! 1kn!

【分析】


我们可以枚举每个位置填的数,以 n = 4, k = 10 为例:

  • 首先枚举第一个应该是什么数,如果是 1,那么后面三个位置一共有 3! 个组合,即当第一个数为 1 时所产生的排列是第 1 ∼ 6 1\sim 6 16 个,那么答案一定不在这,将 k - 3! = 4;然后枚举第一个数是不是 2,此时 3! >= 4,因此答案的第一个数就是 2
  • 枚举第二个数,如果是 1,那么 2! < 4, 则 k - 2! = 2;如果是 3,那么 2! >= 2,所以答案的第二个数就是 3
  • 枚举第三个数,如果是 1,那么 1! < 2,则 k - 1! = 1;如果是 4,那么 1! >= 1,所以答案的第三个数就是 4
  • 枚举第四个数,此时只剩下 1 没被用过了,且 0! >= 1,所以答案的第四个数就是 1

【代码】

class Solution {
public:
    string getPermutation(int n, int k) {
        string res;
        vector<bool> st(10);  // 记录每个数是否被用过
        for (int i = 0; i < n; i++)  // 一共要填入n个数
        {
            int fact = 1;  // 阶乘,当填到第i个数时,后面还有n-i-1个数可以自由排列
            for (int j = 1; j <= n - i - 1; j++) fact *= j;
            for (int j = 1; j <= n; j++)
                if (!st[j])
                {
                    if (fact < k) k -= fact;
                    else
                    {
                        res.push_back(j + '0');
                        st[j] = true;
                        break;
                    }
                }
        }
        return res;
    }
};

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

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

相关文章

ARM DIY(八)USB 调试

前言 V3s 带有一个 USB 接口&#xff0c;将其设置为 HOST 或 OTG 模式&#xff0c;这样可以用来接入键盘、鼠标等 USB 外设。 USB 简介 USB 有两种设备&#xff1a;HOST 和 USB 功能设备。 在 USB2.0 中又引入了一个新的概念 OTG&#xff0c;即设备角色可以动态切换。 切换方…

ZYNQ上的简单 FSK 基带发射器

绪论 由于某种需求需要生成正弦波&#xff0c;因此使用 C 应用程序中的sin()函数来计算单位圆的幅度值&#xff0c;然后将该幅度值转换为 AD9717 的适当 DAC 代码&#xff08;当然将每个角度值转换为弧度&#xff09;。 能够使用DAC生成简单的正弦波&#xff0c;下一个想法就是…

MSYS2 介绍、下载与安装、Pacman常用命令

一、MSYS2 介绍 MSYS2 官网&#xff1a;MSYS2 MSYS2&#xff08;Minimal SYStem 2&#xff09;是一个集成了大量的GNU工具链、工具和库的开源软件包集合。它提供了一个类似于Linux的shell环境&#xff0c;可以在Windows系统中编译和运行许多Linux应用程序和工具。 MSYS2基于…

GPT转换工具:轻松将MBR转换为GPT磁盘

为什么需要将MBR转换为GPT&#xff1f; 众所周知&#xff0c;Windows 11已经发布很长时间了。在此期间&#xff0c;许多老用户已经从Windows 10升级到Windows 11。但有些用户仍在运行Windows 10。对于那些想要升级到Win 11的用户来说&#xff0c;他们可能不确定Win 11应该使…

【初阶C语言】操作符1--对二进制的操作

前言&#xff1a;本节内容介绍的操作符&#xff0c;操作的对象是二进制位。所以前面先介绍整数的二进制位 一、二进制位介绍 1.二进制介绍 &#xff08;1&#xff09;整数的二进制表示形式有三种&#xff1a;原码、反码和补码。 &#xff08;2&#xff09;原码、反码和补码的…

TPS-MIS-DSS

TPS-MIS-DSS 业务处理系统TPS管理信息系统MIS决策支持系统DSS 业务处理系统TPS 最初级的信息系统&#xff0c;管理具体的事务 TPS是其他类型信息系统的信息产生器 处于企业系统的边界 管理信息系统MIS 对企业整体的信息进行处理 使用信息进行预测&#xff0c;控制&#xff0c;计…

一些重要的硬件概念总结

电路噪声 区分噪声和干扰 对于电子线路中所称的噪声&#xff0c;可以概括地认为&#xff0c;它是对目的信号以外所有信号的一个总称。 最初人们把造成收音机这类音响设备所发出的那些电子信号称为噪声。但是&#xff0c;一些非目的的电子信号对电子线路造成的后果并非都和声音有…

【LeetCode每日一题合集】2023.8.28-2023.9.3(到家的最少跳跃次数)

文章目录 57. 插入区间823. 带因子的二叉树解法——递推 1654. 到家的最少跳跃次数(BFS&#xff0c;&#x1f6b9;最远距离上界的证明)1761. 一个图中连通三元组的最小度数2240. 买钢笔和铅笔的方案数解法1——完全背包解法2——枚举买了几支钢笔&#xff08;推荐解法&#xff…

华为云云服务器评测|使用云耀云服务器L实例部署Portainer工具

华为云云服务器评测&#xff5c;使用云耀云服务器L实例部署Portainer工具 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点1.3 云耀云服务器L实例使用场景 二、本次实践介绍2.1 本次实践简介2.2 Portainer简介 三、购买云耀云服务器L实例3.1 登录…

java八股文面试[数据库]——主键的类型自增还是UUID

auto_increment的优点&#xff1a; 字段长度较uuid小很多&#xff0c;可以是bigint甚至是int类型&#xff0c;这对检索的性能会有所影响。 在写的方面&#xff0c;因为是自增的&#xff0c;所以主键是趋势自增的&#xff0c;也就是说新增的数据永远在后面&#xff0c;这点对于…

QT—基于http协议的网络文件下载

1.常用到的类 QNetworkAccessManager类用于协调网络操作&#xff0c;负责发送网络请求&#xff0c;创建网络响应 QNetworkReply类表示网络请求的响应。在QNetworkAccessManager发送一个网络请求后创建一个网络响应。它提供了以下信号&#xff1a; finished()&#xff1a;完成…

Rider 中C#单元测试

使用NUnit.Framework这个包&#xff0c;没有的话可以用nuget去搜索下载。简单的进行单元测试&#xff0c;想要单元测试好像还给需要static函数&#xff0c;慢慢学学C# using System; using NUnit.Framework;namespace client {public class test{[Test]public static void test…

(二十二)大数据实战——Flume数据采集之故障转移案例实战

前言 本节内容我们完成Flume数据采集的故障转移案例&#xff0c;使用三台服务器&#xff0c;一台服务器负责采集nc数据&#xff0c;通过使用failover模式的Sink处理器完成监控数据的故障转移&#xff0c;使用Avro的方式完成flume之间采集数据的传输。整体架构如下&#xff1a;…

纯css实现奥运五环、3D平移与旋转

文章目录 前言效果图htmlcss 前言 1、不是真正的五环&#xff0c;因为通过形变得来。 2、不同电脑显示器的像素不同&#xff0c;显现的效果不同。 3、不推荐使用此方法。 4、主要通过旋转加平移的方式实现。 效果图 html <div class"olympic_rings"><span …

pt23django教程

Django的框架设计模式 MVC 设计模式 MVC 代表 Model-View-Controller&#xff08;模型-视图-控制器&#xff09; 模式。作用: **降低模块间的耦合度**(解耦) - M 模型层(Model), 主要用于对数据库层的封装 - V 视图层(View), 用于向用户展示结果 - C 控制(Controller &#x…

达梦数据库和mysql数据库获取两个坐标之间的距离

91、达梦数据库和mysql数据库获取两个坐标之间的距离 参考&#xff1a;参考 mysql 数据库&#xff1a; select st_distance_sphere(POINT(经度1,纬度1), POINT(经度2,纬度2))达梦数据库没有内置函数&#xff0c;需要自己手动创建函数 CREATE OR REPLACE FUNCTION "模式…

自然语言处理 微调ChatGLM-6B大模型

自然语言处理 微调ChatGLM-6B大模型 1、GLM设计原理2、大模型微调原理1、P-tuning v2方案2、LORA方案 1、GLM设计原理 bert的主要任务是随机的去除掉某个单词&#xff0c;使用上下文将其预测出来&#xff08;相当于完形填空任务&#xff09;&#xff1b; GPT的主要任务是根据前…

【精品】NLP自然语言处理学习路线(知识体系)

当前&#xff0c;大规模预训练语言模型的强大对话问答、文本生成能力&#xff0c;将自然语言处理&#xff08;NLP&#xff09;的研究和应用推向了新一轮的热潮。NLP是计算机科学、人工智能和语言学等学科交叉的前沿领域。NLP的应用和研究范围非常的广泛&#xff0c;个人是没有找…

react-grapesjs——开源代码学习与修改(初出茅庐)

文章目录 ⭐前言⭐grapesjs初始化过程&#x1f496; 渲染大体流程&#x1f496; Editor对象 创建&#x1f496; EditorModel 对象创建&#x1f496; load modules 加载定义的目录模块Module&#x1f496; StyleManager渲染过程 ⭐修改grapesjs配置项⭐总结⭐ 如何修改开源代码⭐…

英诺森 “供应链智能数据平台”荣获“科技进步奖”

近日&#xff0c;2023年中国物流与采购联合会科学技术奖正式公布&#xff0c;该奖项经国家科技部批准&#xff0c;在国家科学技术奖励工作办公室登记备案&#xff0c;是我国物流行业最具影响力的奖项之一。 英诺森联合客户申报的科技项目“英诺森供应链智能数据平台”&#xf…