【PythonCode】力扣Leetcode11~15题Python版

2024-04-13 08:52

本文主要是介绍【PythonCode】力扣Leetcode11~15题Python版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【PythonCode】力扣Leetcode11~15题Python版

前言

力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台,很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。
在Leetcode上刷题,可以选择各种主流的编程语言,如C++、JAVA、Python、Go等。还可以在线编程,实时执行代码,如果代码通过了平台准备的测试用例,就可以通过题目。
本系列中的文章从Leetcode的第1题开始,记录我用Python语言提交的代码和思路,供Python学习参考。

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 == height.length
2 <= n <= 105
0 <= height[i] <= 104

代码实现:

class Solution:def maxArea(self, height: List[int]) -> int:i, j = 0, len(height) - 1max_area = 0while i < j:max_area = max(max_area, (j-i) * min(height[i], height[j]))if height[i] < height[j]:i += 1else:j -= 1return max_area

解题思路:根据题意,本题求的结果是一个长方形的面积,目的是在数组中找到两个数,使它们围成的长方形面积最大。如果这两个数在数组中的索引分别为i和j,那长方形的宽就是 j-i ,长方形的高就是 height[i]和height[j] 中较小的一个。分析到这里,原理基本就清楚了,最粗暴的方式就是遍历数组中所有 i和j 的组合,以找到最大面积,但是这种方式的时间复杂度为 O(N^2),不能通过测试,所以要进行优化。

解题时,可以使用双指针方式,i 初始指向数组的第一个元素,j 初始指向数组的最后一个元素,在初始状态下,长方形的宽度 j-i 是最大的,当指针移动时,宽度不断变小。在宽度不断变小的情况下,如果想得到更大的面积,肯定要找到更高的值,才有可能,所以,每次都保留值更大的指针,移动值更小的指针,看能否找到更大的数,直到指针相遇。指针移动的过程中不断更新最大面积,最后将值返回。这样时间复杂度为 O(N),满足题目要求。

12. 整数转罗马数字

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

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

例如, 罗马数字 2 写做 II ,即为两个并列的 I。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 = 4
输出: “IV”
示例 3:
输入: num = 9
输出: “IX”
示例 4:
输入: num = 58
输出: “LVIII”
解释: L = 50, V = 5, III = 3.
示例 5:
输入: num = 1994
输出: “MCMXCIV”
解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= num <= 3999

代码实现:

class Solution:def intToRoman(self, num: int) -> str:ones = ["", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"]tens = ["", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"]hundreds = ["", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"]thousands = ["", "M", "MM", "MMM"]return thousands[num//1000] + hundreds[num%1000//100] + tens[num%100//10] + ones[num%10]

解题思路:根据罗马数字的规则,个、十、百、千的表示字母各不相同。所以,要将一个整数转换成罗马数字,可以先分解一下,分别将数字的个位数、十位数、百位数、千位数依次转换成罗马数字,再拼接在一起就可以了。

题目规定的数字在1-3999之间,所以在代码中,可以先初始化几个数组,分别表示1-9, 10-90, 100-900, 1000-3000的罗马数字,并且每个数组都要加上0(空字符)。计算数字的千位、百位、十位、个位,并从数组中取出对应的值拼接即可完成转换。

13. 罗马数字转整数

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 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 = “IV”
输出: 4
示例 3:
输入: s = “IX”
输出: 9
示例 4:
输入: s = “LVIII”
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: s = “MCMXCIV”
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= s.length <= 15
s 仅含字符 (‘I’, ‘V’, ‘X’, ‘L’, ‘C’, ‘D’, ‘M’)
题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内
题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。

代码实现:

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

解题思路:本题是上一题的逆转换,但是代码并不是完全一样的思路。根据罗马数字的规则,通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。也就是说,如果罗马数字中小的数字在大的数字的右边,那么是加的关系,如果罗马数字中小的数字在大的数字的左边,那么是减的关系。

所以要完成罗马数字转整数,只需要遍历罗马数字中的每个符号,如果符号比它的后一个符号大,则加上该符号表示的数值,如果符号比它的后一个符号小,则减掉符号的值。

14. 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 1:
输入:strs = [“flower”,“flow”,“flight”]
输出:“fl”
示例 2:
输入:strs = [“dog”,“racecar”,“car”]
输出:“”
解释:输入不存在公共前缀。
提示:
1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

代码实现:

class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:for i in range(len(strs[0])):for s in strs[1:]:if len(s) == i or s[i] != strs[0][i]:return strs[0][0: i]return strs[0]

解题思路:本地要返回的是多个字符串的公共前缀,最后的返回结果也是一个字符串,如果没有公共前缀则返回空字符串。公共前缀是每一个字符串中都有的字符,并且都在字符串的开头,位置和顺序也一样。所以可以先从第一个字符串 strs[0] 中的第一个字符开始寻找,依次取出第一个字符串中的每个字符,遍历其他字符串,对比相同索引位的字符是否相等,如果遇到字符不相等则停止遍历,返回第一个字符串中前面的字符,就得到公共前缀。

同时,每个字符串的长度不一定相同,其他字符串的长度可能比第一个字符串更短,所以如果对比到了第 i 个字符,遇到一个字符串的长度只有 i-1,则停止遍历。

上面的代码中,先计算第一个字符串的长度,用索引从第一个字符串的第一个字符开始遍历,然后遍历剩余字符串,并进行条件判断,遇到不匹配时,返回结果。Python比较巧妙的一点是可以使用切片语法,让代码更简洁。此外,假如 strs 中只有一个字符串,遍历的代码跑不进去,这种情况应直接返回 strs[0] 。

15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != 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 <= nums.length <= 3000
-105 <= nums[i] <= 105

代码实现:

class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums.sort()result = []for i in range(len(nums) - 2):if i > 0 and nums[i] == nums[i - 1]:continueif nums[i] > 0:breakk = len(nums) - 1for j in range(i + 1, len(nums) - 1):if j > i + 1 and nums[j] == nums[j - 1]:continuewhile j < k and nums[i] + nums[j] + nums[k] > 0:k -= 1if j == k:breakif nums[i] + nums[j] + nums[k] == 0:result.append([nums[i], nums[j], nums[k]])return result

解题思路:根据题意,要在数组中找到三个数,使三个数之和为0,并且每个组合中不能重复利用同一个数字,最终要返回所有可能的不重复组合。因为结果是不重复的组合,并且题目也不要求数字组合的顺序与原数组一样,为了方便解题,可以先对数组进行排序。

排序后先取第一个数,就是遍历数组中的第一个到倒数第三个数字,如果遇到相等的数字就跳过,因为这种情况得到的组合是重复的。如果遇到大于0的数字就退出循环,因为已经将数组排序了,如果第一个数字大于0,后面的数字都大于或等于第一个数字,三个数的和不可能等于0。

取了第一个数,继续嵌套遍历取第二个数,即从第一个数字的后一个数字遍历到数组的倒数第二个数字,同理如果遇到相等的数字就跳过。

在遍历第二个数字的同时,可以用指针从数组的最后一个数字开始获取第三个数字,并在遍历的过程中计算三个数字的和。如果三个数的和等于0,说明找到了一种组合,将这种组合保存下来。如果三个数的和小于0,则说明当前找不到第三个数来与前两个数组合,不需要做处理,继续遍历改变前两个数。如果三个数的和大于0,则向左移动指针,使第三个数变小,直到找到满足和为0的组合或指针与第二个数的索引相遇。用指针的方式获取第三个数字,可以降低整体的时间复杂度。


相关阅读

PythonCode】力扣Leetcode6~10题Python版

📢欢迎 点赞👍 收藏⭐ 评论📝 关注 如有错误敬请指正!

☟ 学Python,点击下方名片关注我。☟

这篇关于【PythonCode】力扣Leetcode11~15题Python版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/899690

相关文章

python中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

Python使用PIL库将PNG图片转换为ICO图标的示例代码

《Python使用PIL库将PNG图片转换为ICO图标的示例代码》在软件开发和网站设计中,ICO图标是一种常用的图像格式,特别适用于应用程序图标、网页收藏夹图标等场景,本文将介绍如何使用Python的... 目录引言准备工作代码解析实践操作结果展示结语引言在软件开发和网站设计中,ICO图标是一种常用的图像

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常