【LeetCode算法系列题解】第11~15题

news2024/10/5 14:17:01

CONTENTS

    • LeetCode 11. 盛最多水的容器(中等)
    • LeetCode 12. 整数转罗马数字(中等)
    • LeetCode 13. 罗马数字转整数(简单)
    • LeetCode 14. 最长公共前缀(简单)
    • LeetCode 15. 三数之和(中等)

LeetCode 11. 盛最多水的容器(中等)

【题目描述】

给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。

【示例1】

在这里插入图片描述

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

【示例2】

输入:height = [1,1]
输出:1

【提示】

n = h e i g h t . l e n g t h n = height.length n=height.length
2 ≤ n ≤ 1 0 5 2\le n\le 10^5 2n105
0 ≤ h e i g h t [ i ] ≤ 1 0 4 0\le height[i]\le 10^4 0height[i]104

【分析】


很巧妙的一道贪心思维题,我们先在最左边和最右边设置两个指针,每次将指针指向的数较小的那个指针往中间靠拢一格,且每次都维护一遍最大值即可。因为当一个指针往中间移动时,矩形的宽度缩小了,想要面积变大,那肯定需要指针指向的数值(即矩形高度)变大,而矩形的高度的瓶颈在于较短的那一条边,因此移动较小的指针。


【代码】

class Solution {
public:
    int maxArea(vector<int>& height) {
        int res = 0;
        for (int l = 0, r = height.size() - 1; l < r; )
        {
            res = max(res, (r - l) * min(height[l], height[r]));
            if (height[l] < height[r]) l++;
            else r--;
        }
        return res;
    }
};

LeetCode 12. 整数转罗马数字(中等)

【题目描述】

罗马数字包含以下七种字符:IVXLCDM

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如,罗马数字 2 写做 II,即为两个并列的 1。12 写做 XII,即为 X + II。27 写做 XXVII,即为 XX + V + II

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V(5)和 X(10)的左边,来表示 4 和 9。
  • X 可以放在 L(50)和 C(100)的左边,来表示 40 和 90。
  • C 可以放在 D(500)和 M(1000)的左边,来表示 400 和 900。

给你一个整数,将其转为罗马数字。

【示例1】

输入: num = 3
输出: "III"

【示例2】

输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.

【示例3】

输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.

【提示】

1 ≤ n u m ≤ 3999 1\le num\le 3999 1num3999

【分析】


在这里插入图片描述

我们先打个表找规律,把几个特殊的数字打表记下来,然后从高到低枚举,以 2964 为例,先循环判断是否大于1000,若满足则减去1000并在答案中添加 M,整个模拟流程如下:

2964  ""
1964  "M"
964   "MM"
64    "MMCM"
14    "MMCML"
4     "MMCMLX"
0     "MMCMLXIV"

【Python代码】

class Solution:
    def intToRoman(self, num: int) -> str:
        dic = collections.OrderedDict(
            M=1000, CM=900, D=500, CD=400, C=100, XC=90,
            L=50, XL=40, X=10, IX=9, V=5, IV=4, I=1
        )
        res = ''
        for k, v in dic.items():
            while num >= v:
                res += k; num -= v
        return res

LeetCode 13. 罗马数字转整数(简单)

【题目描述】

罗马数字包含以下七种字符:IVXLCDM

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如,罗马数字 2 写做 II,即为两个并列的 1。12 写做 XII,即为 X + II。27 写做 XXVII,即为 XX + V + II

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V(5)和 X(10)的左边,来表示 4 和 9。
  • X 可以放在 L(50)和 C(100)的左边,来表示 40 和 90。
  • C 可以放在 D(500)和 M(1000)的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。

【示例1】

输入: s = "III"
输出: 3

【示例2】

输入: s = "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.

【示例3】

输入: s = "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

【提示】

1 ≤ s . l e n g t h ≤ 15 1\le s.length\le 15 1s.length15
s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999]
题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况
ILIM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX

【分析】


和上一题相似,先对罗马数字进行观察,发现除了4、40、400和9、90、900以外的其他罗马数字直接将每个字母转换成对应的整数相加即可。上面提到的这6个罗马数字他们的前一位数字比后一位数字更小,对其进行特判即可。


【Python代码】

class Solution:
    def romanToInt(self, s: str) -> int:
        dic = dict(M=1000, D=500, C=100, L=50, X=10, V=5, I=1)
        res = 0
        for i in range(len(s)):
            if i + 1 < len(s) and dic[s[i]] < dic[s[i + 1]]:
                res -= dic[s[i]]
            else:
                res += dic[s[i]]
        return res

LeetCode 14. 最长公共前缀(简单)

【题目描述】

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""

【示例1】

输入:strs = ["flower","flow","flight"]
输出:"fl"

【示例2】

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

【提示】

1 ≤ s t r s . l e n g t h ≤ 200 1\le strs.length\le 200 1strs.length200
0 ≤ s t r s [ i ] . l e n g t h ≤ 200 0\le strs[i].length\le 200 0strs[i].length200
strs[i] 仅由小写英文字母组成

【分析】


简单的模拟题,直接从前往后枚举每个字符串的字符是否相等即可。


【代码】

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        string res = "";
        if (strs.empty()) return res;
        for (int i = 0; i < strs[0].size(); i++)
        {
            for (int j = 1; j < strs.size(); j++)
                if (i >= strs[j].size() || strs[j][i] != strs[0][i]) return res;
            res += strs[0][i];
        }
        return res;
    }
};

LeetCode 15. 三数之和(中等)

【题目描述】

给你一个整数数组 nums,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k,同时还满足 nums[i] + nums[j] + nums[k] == 0
请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

【示例1】

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

【示例2】

输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

【示例3】

输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

【提示】

3 ≤ n u m s . l e n g t h ≤ 3000 3\le nums.length\le 3000 3nums.length3000
− 1 0 5 ≤ n u m s [ i ] ≤ 1 0 5 -10^5\le nums[i]\le 10^5 105nums[i]105

【分析】


先对数列进行排序,为了避免重复,我们规定三个指针 i < j < k i<j<k i<j<k,我们枚举其中一个指针 i i i,也就是固定 i i i,然后通过双指针算法找出 j j j k k k。我们让 j j j 从前往后走,让 k k k 从后往前走,我们要找出 nums[i] + nums[j] + nums[k] == 0,由于序列是单调递增的,我们将 k k k 从右往左移动,找到最小的满足 nums[i] + nums[j] + nums[k] >= 0 k k k,如果此时不满足等于0,那么就将 j j j 向右移,增大这个式子的和,然后再将 k k k 向左移直到找到最小的满足 nums[i] + nums[j] + nums[k] >= 0 k k k,再判断是否等于0,以此类推。

还有一点需要注意的是枚举 i i i j j j 的时候如果 nums[i]/nums[j] 和上一个数一样就要跳过(序列是有序的因此和上一个数不一样的话之后也不会再出现之前的数了),防止重复枚举。


【代码】

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<vector<int>> res;
        for (int i = 0; i < nums.size(); i++)
        {
            if (i && nums[i] == nums[i - 1]) continue;
            for (int j = i + 1, k = nums.size() - 1; j < k; j++)
            {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue;
                while (nums[i] + nums[j] + nums[k - 1] >= 0 && j < k - 1) k--;
                if (nums[i] + nums[j] + nums[k] == 0) res.push_back({ nums[i], nums[j], nums[k] });
            }
        }
        return res;
    }
};

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

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

相关文章

Unity碰撞检测(3D和2D)

Unity碰撞检测3D和2D 前言准备材料3D2D 代码3D使用OnCollisionEnter()进行碰撞Collider状态代码 使用OnTriggerEnter()进行碰撞Collider状态代码 2D使用OnCollisionEnter2D()进行碰撞Collider2D状态代码 使用OnTriggerEnter2D()进行碰撞Collider2D状态代码 区别3D代码OnCollisi…

Python中*(星号)传可变长的元组

在Python中&#xff0c;*&#xff08;星号&#xff09;可以用来传递变长元组参数&#xff0c;通常在函数定义和函数调用中使用。这是一种用于处理不定数量的参数的方式&#xff0c;使得函数能够接受任意数量的位置参数。 在函数定义中使用 *&#xff1a; 在函数定义时&#xff…

Jupyter lab 配置

切换jupyterlab的默认工作目录 在终端中输入以下命令 PS C:\Users\Administrator> jupyter-lab --generate-config Writing default config to: C:\Users\Administrator\.jupyter\jupyter_lab_config.py它就会生成JupyterLab的配置文件&#xff08;如果之前有这个文件的话…

奥威BI数据可视化工具一出马,财务数据分析不再烧脑

数据可视化工具可以使财务数据分析更加直观和易于理解。这些工具可以将大量的财务数据简化为易于阅读和理解的图表、图形和表格&#xff0c;帮助财务人员更快地分析和发现问题。例如&#xff0c;通过将财务数据转化为柱状图、折线图、饼图等图形&#xff0c;可以更加清晰地展示…

《向量数据库指南》——腾讯云向量数据库(Tencent Cloud VectorDB) SDK 正式开源

腾讯云向量数据库 SDK 宣布正式开源。根据介绍,腾讯云向量数据库(Tencent Cloud VectorDB)的 Python SDK 与 Java SDK 是基于数据库设计模型,遵循 HTTP 协议,将 API 封装成易于使用的 Python 与 Java 函数或类,为开发者提供了更加友好、更加便捷的数据库使用和管理方式。…

刚来的00后进来就有18K,我三年工作经验就是个笑话

00后带来的压力 公司一位工作3年的老油条工资还没有刚来的00后高&#xff0c;她心中不平&#xff0c;对这件事情有不小的怨气&#xff0c;她觉得自己来公司三年了&#xff0c;三年内迟到次数都不超过5次&#xff0c;每天勤勤恳恳&#xff0c;要加班的时候也愿意加班&#xff0…

vue自定义事件 div 拖拽方法缩小

在main.js 引用 // 引入拖动js import dragMove from "./utils/dragMove.js" 创建 drawmove.js export default (app) > {app.directive(dragMove, (el, binding) > {const DragVindow el.querySelector(binding.value.DragVindow)// 按下鼠标处理事件con…

修改yum下载文件的位置,指定安装位置

yum update 的软件包&#xff0c;可以放在别的地方。即可。 修改/etc/yum.conf 指定安装位置 yum -c /etc/yum.conf --installroot/usr/local --releasever/ install 你需要安装的软件

六、抽象工厂模式

一、什么是抽象工厂模式 抽象工厂&#xff08;AbstractFactory&#xff09;模式的定义&#xff1a;是一种为访问类提供一个创建一组相关或相互依赖对象的接口&#xff0c;且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。 抽象工厂模式的主要角色如下…

共享办公室的7S管理

共享办公室的7S管理是一个全面且详细的过程&#xff0c;它涵盖了整理&#xff08;Sort&#xff09;、整顿&#xff08;Straighten&#xff09;、清扫&#xff08;Sweep&#xff09;、清洁&#xff08;Sanitize&#xff09;、素养&#xff08;Sustain&#xff09;、安全&#xf…

报错:Cannot read properties of undefined (reading ‘$message‘)

报错 一、问题二、分析三、解决 一、问题 Cannot read properties of undefined (reading ‘$message’) 二、分析 是因为在 main.js 文件中&#xff0c;此时还未有 this&#xff0c;我们可以打印一下&#xff0c;是 null 三、解决 如果想要使用 this.$message(这是一条消息…

数仓数据建模中的概念总结(数据域、主题域、总线矩阵、指标...)

概念归纳 业务分类&#xff1a;业务板块是某一大类业务的指标和维度的集合&#xff0c;如电商&#xff0c;文 娱。 数据域&#xff1a;面向业务分析&#xff0c;将业务过程或者维度进行抽象的集合&#xff0c;如交易域&#xff0c; 日志域。 将零散的需求分类&#xff0c;后续…

VSCode配置C语言环境(简单易懂,小白专用)

1.在VSCode中安装C/C插件和C/C Extension Pack插件 2.下载mingw64 mingw64官网网页链接 1、找到downloads ​​​​​​​​ 2、找到SourceForge 3、找到一个合适的版本&#xff08;我这里是下拉找到免安装版&#xff09;下载&#xff0c;其他的都试过了&#xff0c;都不行&a…

window11,C盘瘦身减肥技巧

创作灵感 本文主要说明如何给windows11的C盘进行空间优化&#xff0c;或者叫减肥瘦身&#xff0c;让其达到20G以内。绝大部分内容&#xff0c;也适用于window10和windows7&#xff0c;只是操作系统不同&#xff0c;操作方式略有不同。不关注C盘空间的读者&#xff0c;可以忽略…

rsync命令介绍与使用案例

一、rsync命令简介 Rsync命令是一个常用的用于文件传输和同步的工具&#xff0c;rsync 可以理解为 remote sync&#xff08;远程同步&#xff09;&#xff0c;为了减少网络数据发送量&#xff0c;只发送源文件和目标文件之间的差异信息&#xff0c;从而实现数据的增量的复制。它…

DP3232 国产RS-232接口收发器芯片

DP3232是一个3.3 V.供电的 EIA/TIA-232和 V.28/V.24通信接口&#xff0c;具有低功耗要求、高数据速率能力。DP3232拥有一个专有的低压差发射机输出平台&#xff0c;提供真正的 RS-232性能&#xff0c;从3.3 vV 到5.5 V 电源。该设备只需要四个小的0.1 μF 标准外部电容器从3.3 …

原生小程序 wxs 语法(详细)

WXS WXS&#xff08;WeiXin Script&#xff09;是内联在 WXML 中的脚本段。通过 WXS 可以在模版中内联少量处理脚本&#xff0c;丰富模板的数据预处理能力。另外&#xff0c; WXS 还可以用来编写简单的 WXS 事件响应函数。 从语法上看&#xff0c; WXS 类似于有少量限制的 Java…

LOIC(low orbit ion cannon)

前言 重要的话说三遍&#xff1a; 该程序仅用于学习用途&#xff0c;请勿用于非法行为上&#xff01;&#xff01;&#xff01; 该程序仅用于学习用途&#xff0c;请勿用于非法行为上&#xff01;&#xff01;&#xff01; 该程序仅用于学习用途&#xff0c;请勿用于非法行为上…

麒麟系统查看飞腾CPU的工作模式、实时频率的方法

CPU动态节能技术用于降低功耗,通过选择系统空闲状态不同的电源管理策略,可以实现不同程度降低CPU功耗,更低的功耗策略意味着CPU唤醒更慢对性能影响更大。本文这里讲解了如何使用命令查看系统下CPU的工作模式,和实时频率。 测试用系统信息: # cat /etc/os-releaseNAME=&qu…

com.google.guava:guava 组件安全漏洞及健康分析

组件简介 维护者google组织许可证类型Apache-2.0首次发布2010 年 4 月 26 日最新发布时间2023 年 8 月 1 日GitHub Star48189GitHub Fork10716依赖包28,694依赖存储库219,576 Guava 是 Google 的一组核心 Java 库&#xff0c;其中包括新的集合类型&#xff08;例如 multimap 和…