【PythonCode】力扣Leetcode46~50题Python版

【PythonCode】力扣Leetcode46~50题Python版

前言

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

46. 全排列

给定一个不含重复数字的数组 nums ,返回其所有可能的全排列 。你可以按任意顺序返回答案。

示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1]
输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同

代码实现:

class Solution:def permute(self, nums: List[int]) -> List[List[int]]:result = []def backtrack(nums, temp):if not nums:result.append(temp)return for i in range(len(nums)):backtrack(nums[:i] + nums[i+1:], temp + [nums[i]])backtrack(nums, [])return result

解题思路:根据题意,原始数组中不含重复的元素,要返回用数组中的元素组成的全排列,也就是将数组中的不同元素按不同的顺序排列,得到不同的排列组合。这需要枚举所有不同的排列方式,可以使用回溯算法。回溯算法参考:循序渐进,搞懂什么是回溯算法

在代码中,每次从nums中取一个元素添加到排列中,然后将nums更新成删除此元素后的数组,用一个临时数组temp保存当前已经枚举的元素,每从nums中取出一个元素,都添加到temp中。当nums中的元素被枚举完时,得到一种排列组合,此时将temp添加到结果中,并往回回溯,枚举其他组合。

回溯的题目前面已经多次遇到,前面的力扣17题、22题、37题、39题、40题都是,可以访问本专栏前面的文章,结合起来一起看,加深理解。本题相对前面的题来说,属于简单的。

47. 全排列 II

给定一个可包含重复数字的序列 nums ,按任意顺序返回所有不重复的全排列。

示例 1:
输入:nums = [1,1,2]
输出: [[1,1,2], [1,2,1], [2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10

代码实现:

class Solution:def permuteUnique(self, nums: List[int]) -> List[List[int]]:result = []def backtrack(nums, temp):if not nums and temp not in result:result.append(temp)return for i in range(len(nums)):backtrack(nums[:i] + nums[i+1:], temp + [nums[i]])backtrack(nums, [])return result

解题思路:本题是上一题的变体,唯一的区别是,上一题的原始数组中不含重复的元素,本题的原始数组中可包含重复的元素。相同的元素可以重复出现在一种组合中,但最后得到的排列中不能有重复的排列。所以代码与上一题唯一的区别是,将枚举的排列保存到结果中时,判断当前结果中是否已有相同的排列,有就不重复添加了。

48. 旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。

示例 1:
在这里插入图片描述
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:
在这里插入图片描述
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000

代码实现:

class Solution:def rotate(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""n = len(matrix)for i in range(n // 2):for j in range((n + 1) // 2):matrix[i][j], matrix[n-1-j][i], matrix[n-1-i][n-1-j], matrix[j][n-1-i] = matrix[n-1-j][i], matrix[n-1-i][n-1-j], matrix[j][n-1-i], matrix[i][j]

解题思路:题目要求将 n × n 的二维矩阵原地旋转90度。原地旋转就是不能使用新的矩阵,而是直接在原矩阵中交换相应位置的值。所以,解题的关键是找到交换位置的规律。

以题目中的示例1为例,其交换位置的关系如下图所示。因为是将矩阵旋转90度,所以先将矩阵分成四个象限,辅助观察规律。在旋转发生时,矩阵中每四个位置相互交换位置,如数字2,6,8,4,对应的索引分别为[0, 1],[1, 2],[2, 1],[1, 0],还有数字1,3,9,7,对应的索引分别为[0, 0],[0, 2],[2, 2],[2, 0]。

在这里插入图片描述
可以看到,如果将需要旋转的数字分成4组,就是将上图中的不同颜色区域进行旋转。可以看到,第一行旋转后位置全在最后一列,旋转后列索引全是n-1,并且旋转后对应位置的行索引就是旋转前的列索引,也就是将matrix[i][j]旋转到了matrix[j][n-1-i](这里列索引n-1-i是将i也考虑进来,表示更一般的规律)。最后一列旋转后位置全在最后一行,且列索引位置是从最大开始往前推,也就是将matrix[j][n-1-i]旋转到了matrix[n-1-i][n-1-j]。最后一行旋转后位置全在第一列,且行索引位置是从最大开始往前推,也就是将matrix[n-1-i][n-1-j]旋转到了matrix[n-1-j][i]。最后,再将matrix[n-1-j][i]旋转到matrix[i][j]。这样就找到了一般性的旋转规律。

当n为奇数时(上图n为3),正中心的数字不需要旋转,每组的数字个数为(n2-1)/4个,(n2-1)/4=((n-1)/2)×((n+1)/2),所以我们需要遍历前(n-1)/2行和前(n+1)/2列(观察图形区域,第一个区域列数大于行数),找到第一个区域的数字,将它们与相应位置的数字相互交换位置。

当n为偶数时,以题目中的示例2为例,如下图所示。旋转的位置关系与n为奇数时相同,也是matrix[j][n-1-i],matrix[j][n-1-i],matrix[n-1-i][n-1-j],matrix[n-1-j][i]的数字相互交换。n为偶数,所有数字位置都会变化,将矩阵分成4个区域,每组的数字为n2/4个,n2/4=(n/2)×(n/2),所以我们需要遍历前n/2行和前n/2列,找到第一个颜色区域的数字,将它们与相应位置的数字相互交换位置。综合n为奇数和n为偶数,需要遍历n//2行和前(n+1)//2列(地板除奇数n-1和n一样,偶数n和n+1一样)。

在这里插入图片描述

根据上面的分析,只需要遍历矩阵中的第一个区域,将它们全部与对应索引关系的数字交换位置,即可达成旋转的效果。Python中交换值的写法很简洁,代码并不难。

49. 字母异位词分组

给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。

字母异位词是由重新排列源单词的所有字母得到的一个新单词。

示例 1:
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]
示例 2:
输入: strs = [“”]
输出: [[“”]]
示例 3:
输入: strs = [“a”]
输出: [[“a”]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母

代码实现:

class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:anagram_dict = {}for word in strs:sorted_word = ''.join(sorted(word))if sorted_word not in anagram_dict:anagram_dict[sorted_word] = [word]else:anagram_dict[sorted_word].append(word)return list(anagram_dict.values())

解题思路:同一组字母异位词中各字母出现的次数相同,只是顺序不同。组合方式类似于数字的不同排列,参考上面的46题和47题。这种情况前面已经遇到多次,可以用Python中的Counter来判断,参考:详解Python中非常好用的计数器Counter

如果将字符串排序,同一组字母异位词的排序结果相等。要将字符串数组中不同的字母异位词分组,可以将所有字符串排序,并将排序结果相等的字符串分到同一组中,Python中可以使用字典来实现。题目要求最后返回的是一个数组,分组完成后,取字典的values()转成列表即可。

50. Pow(x, n)

实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。

示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
n 是一个整数
要么 x 不为零,要么 n > 0 。
-104 <= xn <= 104

代码实现:

class Solution:def myPow(self, x: float, n: int) -> float:if n == 0:return 1if x == 0:return 0if n < 0:x, n = 1/x, -nresult = 1while n:if n % 2 == 1:result *= xx *= xn //= 2return result

解题思路:幂运算的原理就是连乘,所以要自己实现幂运算函数功能,就是用乘法。

不过,如果用x乘n次(231 <= n <= 231-1)自己,时间复杂度为O(n),运算会超时。所以这里连乘时应该使用二分法,将时间复杂度降到O(logn)。

将时间复杂度降到O(logn)的关键是,x乘自己后,将乘积结果赋值给自己,更新x,这样达到的效果就是乘logn次。不过n不一定能被2整除,n为奇数时要先做一次乘法处理。如果n不能被2整除,则先将x乘一次当前的累乘结果,不更新x,这样n减1(代码中可以省略n-1的操作,n除2时取整除),从奇数变成偶数,就可以被2整除了。如果n能被2整除,则可以直接将x乘自己并赋值给自己,n更新成n/2。

如果n是负数,则将x转换成1/x,将n转换成-n,从负数变成正数。

此外,还需要对一些特殊情况做处理,如n等于0。


相关阅读

【PythonCode】力扣Leetcode41~45题Python版

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

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

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

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

相关文章

数据仓库建模方法论 :维度模型

使用ER模式建立的数仓&#xff0c;优点是没有冗余的数据。缺点是&#xff1a;数仓是用于分析的&#xff0c;分析的数据量特别大&#xff0c;多个表需要join操作&#xff0c;运行的时候特别慢。 比如&#xff1a;统计哪一年&#xff0c;哪个国家的哪个品类卖的最好&#xff1f;…

如何实现一个流畅的滚动列表

如何实现一个流畅的滚动列表 在网页开发中&#xff0c;滚动列表是展示大量数据时常用的交互方式。通过结合CSS动画和视觉设计&#xff0c;我们可以让列表内容自动滚动&#xff0c;为用户提供顺畅的浏览体验。今天&#xff0c;我将带你一步步实现一个流畅、富有视觉吸引力的滚动…

地平线占用预测 FlashOcc 参考算法-V1.0

1.简介 3D Occupancy Networks 的基本思路是将三维空间划分成体素网格&#xff0c;并对每个网格进行各类感知任务的预测。目前以网格为中心的方法能够预测每个网格单元的占用率、语义类别、未来运动位移和实例信息。3D occupancy 可以对道路障碍物进行更细粒度的划分&#xff…

如何利用nw.js打包vue项目

引言 最近有一个开发windows桌面应用的需求, 需要将vue项目打包成.exe文件&#xff0c;最好是变成可安装版(非绿色版)。特此记录一下如何通过nw.js将vue项目打包成.exe。可能这种方式不是最优&#xff0c;仅供大家参考&#xff01; nw.js简介&#xff08;以下描述来自nw.js官…

如何估算 Transformer 模型中的参数数量

最有效的理解新机器学习架构&#xff08;以及任何新技术&#xff09;的方式是从零开始实现它。虽然这种方法非常复杂、耗时&#xff0c;并且有时几乎不可能做到&#xff0c;但它能帮助你深入理解每一个实现细节。例如&#xff0c;如果你没有相应的计算资源或数据&#xff0c;你…

AI宠物拟人化新玩法,教你如何用0成本打造爆款创意内容!

近年来&#xff0c;随着AI技术的快速发展&#xff0c;各种创新玩法不断涌现&#xff0c;尤其是在内容创作领域&#xff0c;AI带来的变革尤为显著。 **其中&#xff0c;宠物拟人化逐渐成为社交媒体上的一大热门话题。**通过AI生成工具&#xff0c;我们不仅可以将宠物拟人化&…

面试面经|大模型算法岗常见面试题100道

本文提供了一份全面的大模型算法岗位面试题清单&#xff0c;包括基础理论、模型结构、训练微调策略、应用框架、分布式训练和模型推理等方面的知识点&#xff0c;旨在帮助求职者准备相关技术面试。 一、基础篇 1、目前主流的开源模型体系有哪些&#xff1f; Transformer体系&a…

基于yolov8和openpose人体骨骼关键点实现的摔倒姿态识别检测系统实现

【参考源码】 GitHub - HRonaldo/Openpose_YOLO 本项目参考上面框架进行全面改进&#xff0c;改进如下&#xff1a; &#xff08;1&#xff09;将检测框架换成当前最流行框架yolov8&#xff0c;并封装成类实现模块化设计。关于yolov5优化项目可以访问&#xff1a;https://bl…

队列的各种接口的实现(C)

队列的概念 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队头 队列的实…

华为地图服务 - 如何在地图上绘制多边形? -- HarmonyOS自学16

场景介绍 本章节将向您介绍如何在地图上绘制多边形。 接口说明 添加多边形功能主要由MapPolygonOptions、addPolygon和MapPolygon提供&#xff0c;更多接口及使用方法请参见接口文档。 接口名 描述 MapPolygonOptions 用于描述MapPolygon属性。 addPolygon(options: mapC…

(八)使用Postman工具调用WebAPI

访问WebAPI的方法&#xff0c;Postman工具比SoapUI好用一些。 1.不带参数的get请求 [HttpGet(Name "GetWeatherForecast")] public IEnumerable<WeatherForecast> Get() {return Enumerable.Range(1, 5).Select(index > new WeatherForecast{Date DateT…

优优嗨聚集团:引领互联网服务新篇章

在当今这个日新月异的互联网时代&#xff0c;企业之间的竞争愈发激烈&#xff0c;如何高效地运营线上业务成为了众多商家关注的焦点。在这一背景下&#xff0c;四川优优嗨聚集团凭借其卓越的服务质量、创新的技术解决方案和强大的品牌影响力&#xff0c;逐渐成为了众多商家信赖…

【大模型教程】如何在Spring Boot中无缝集成LangChain4j,玩转AI大模型!

0 前言 LangChain4j 提供了用于以下功能的 Spring Boot 启动器&#xff1a; 常用集成声明式 AI 服务 1 常用集成的 Spring Boot starters Spring Boot 启动器帮助通过属性创建和配置 语言模型、嵌入模型、嵌入存储 和其他核心 LangChain4j 组件。 要使用 Spring Boot 启动…

基于MATLAB的虫害检测系统

课题背景介绍 中国为农业大国&#xff0c;因此在农业病虫害防治等方面积累了丰富的经验&#xff0c;但在实际工作过程中也存在许多问题。如过于依赖传统经验&#xff0c;对突如而来的新型病虫害问题研究不够到位&#xff0c;如由于判断者主观上面的一些模糊&#xff0c;而带来…

从零实现循环神经网络(二)

#本篇博客代码是基于上一篇《从零实现循环神经网络&#xff08;一&#xff09;》 上一篇网址&#xff1a;从零实现循环神经网络&#xff08;一&#xff09;-CSDN博客 1.初始化时返回隐藏层状态 def init_rnn_state(batch_size, num_hiddens, device):"""bat…

大神用一幅动态的风景画:让天气预报变得更生动

你有没有想过,有一天你可以不看那些冰冷的天气图表,而是通过一幅美丽的风景画就能知道明天的天气?想象一下,清晨醒来,打开手机,看到的不是一堆晦涩的数字,而是一幅阳光洒满草原的画,告诉你今天是个好天气。这就是现在逐渐兴起的一种新方式——通过风景图像来可视化天气…

【网络】高级IO——LT和ET

在上一篇的学习中&#xff0c;我们已经简单的使用了epoll的三个接口&#xff0c;但是仅仅了解那些东西是完全不够的&#xff01;&#xff01;接下来我们将更深入的学习epoll 1.epoll的两种工作模式——LT和ET 下面来举一个例子帮助大家理解ET和LT模式的区别&#xff08;送快递…

内存:生成式AI带来全新挑战与机遇

之前小编也写过多篇AI存储相关的文章&#xff0c;包括AI背景与分层存储的分析&#xff0c;以及AI存储重点从训练转向推理等内容。具体参考&#xff1a; 深度剖析&#xff1a;AI存储架构的挑战与解决方案 存储正式迈入超大容量SSD时代&#xff01; 这可能是最清晰的AI存储数据…

stack和queue(一)

接下来讲解一些stack栈和queue的简单使用 stack的概念 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与提取操作。 特性是先进先出 后进后出 构造一个栈堆 int main() {deque<int>…

vue项目加载cdn失败解决方法

注释index.html文件中 找到vue.config.js文件注释、