【PythonCode】力扣Leetcode1~5题Python版

【PythonCode】力扣Leetcode1~5题Python版

前言

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

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

代码实现:

class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for i in range(len(nums)):for j in range(i+1, len(nums)):if nums[i] + nums[j] == target:return [i, j]

解题思路:嵌套遍历从数组中取出两个数相加,用嵌套的for循环,判断相加的结果是否满足要求,如果满足则用列表返回两个数据的索引。因为同一个元素不能重复出现,所以索引 j 从 i+1 开始遍历。

2. 两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零

代码实现:

class Solution:def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:l1num, l2num = l1.val, l2.vali, j = 0, 0cur = l1while cur.next:cur = cur.nexti += 1l1num += cur.val * 10 ** icur2 = l2while cur2.next:cur2 = cur2.nextj += 1l2num += cur2.val * 10 ** jsumnum = l1num + l2numresult = ListNode()cur = resultfor s in str(sumnum)[::-1]:cur.next = ListNode(int(s))cur = cur.nextreturn result.next

解题思路:先按照逆序的方式将 l1 和 l2 两个链表转化成对应的整数,转化时依次将第 i 个节点的数字乘 10 的 i 次方,并全部相加,i 从 0 开始。得到两个整数,计算两个整数之和。然后将整数之和倒序保存到链表中,每个节点一个数字。我采用的方式是将两数之和转换成字符串倒着遍历,再将每个数字转换回整数,然后创建节点添加到链表中。

3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成

代码实现:

class Solution:def lengthOfLongestSubstring(self, s: str) -> int:length = 0for i in range(len(s)):slist = []for j in range(i, len(s)):if s[j] not in slist:slist.append(s[j])else:breaklength = max(length, len(slist))return length

解题思路:遍历字符串的索引,以每一个索引位为标志位,从标志位往后找最长的子串。最长子串的判断方式用列表实现,如果连续的字符不在列表中,则添加进列表,遇到重复的字符时跳出内循环。循环结束后计算列表的长度,并更新当前的最长长度。每次移动标志位,清空用于保存字符的列表。

4. 寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

示例1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106

代码实现:

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:m = len(nums1)n = len(nums2)if m > n:return self.findMedianSortedArrays(nums2,nums1)k = (m + n + 1)//2left = 0right = mwhile left < right :m1 = left +(right - left)//2m2 = k - m1if nums1[m1] < nums2[m2-1]:left = m1 + 1else:right = m1m1 = leftm2 = k - m1 c1 = max(nums1[m1-1] if m1 > 0 else float("-inf"), nums2[m2-1] if m2 > 0 else float("-inf") )if (m + n) % 2 == 1:return c1c2 = min(nums1[m1] if m1 < m else float("inf"), nums2[m2] if m2 <n else float("inf"))return (c1 + c2) / 2

解题思路:此题在Leetcode上的难度是困难,属于等级最高的难度(简单、中等、困难),困难的原因是要求时间复杂度为O(log (m+n))。主要目的是考算法思路,并且要提交者自己实现算法。如果没有时间复杂度的要求,实现其实很简单,如下代码就可以通过力扣的用例(甚至可以更简单,导入一个求中位数的函数):

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:nums = sorted(nums1 + nums2)if len(nums) % 2 == 0:return (nums[int(len(nums) // 2) - 1] + nums[int(len(nums) // 2)]) / 2else:return nums[len(nums) // 2]

因为要求时间复杂度为 O(log (m+n)),我一开始也没有想到好的方法,所以参考了力扣用户powcai的答案。两个数组都是正序排列的,所以找到中位数的策略是从两个数组中找出排序在前一半的数据,中间的数字就是中位数。也就是找出第 k 大的那个数字,k 是两个数组长度之和的一半,或中间的两个数(k, k+1)。

假如使用遍历,时间复杂度将会是 O(m+n),为了将时间复杂度降到题目要求的O(log (m+n)),需要使用二分法的方式查找。遍历是每次排除一个数据不是第 k 大,二分查找每次排除 k/2 个数据不是第 k 大。在这个思路的基础上,结合上面的代码就可以分析出解题办法了。如果你需要了解更详细的解题细节,可以自己再搜索更多的参考答案。

5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
提示:
1 <= s.length <= 1000 s 仅由数字和英文字母组成

代码实现:

class Solution:def longestPalindrome(self, s: str) -> str:max_length = 1start_index = 0i = 0while i < len(s):length = 1left = i - 1while left >= 0 and s[left] == s[i]:length += 1left -= 1right = i + 1while right < len(s) and s[right] == s[i]:length += 1right += 1i += 1while left >= 0 and right < len(s) and s[left] == s[right]:length += 2left -= 1right += 1if length > max_length:max_length = lengthstart_index = left+1i += 1return s[start_index:start_index+max_length]

解题思路:要找到字符串 s 中的最长回文子串,需要找到最长回文子串的长度 max_length 和回文子串的开始索引 start_index 。因为 s 的长度最短为1,所以 max_length 最小为 1,start_index 初始为 0,以此为初始值,当找到更长的回文子串时更新两者的值。

遍历字符串的每一个字符,以每一个字符为标志位,判断标志位左侧的字符是否与标志位的字符相同,如果相同则继续向左找,每找到一个字符,回文子串的长度加1,右侧也同理。这样可以找到标志位两侧与标志位相同的所有连续字符,包含了奇数个和偶数个两种情况。

找完与标志位相同的连续字符后,再继续找左边的字符与右边的字符相同的情况,此时每找到一对相同的字符,回文子串的长度加2,直到两边的字符不同或到达字符串 s 的边界。完成后判断此次找到的最长回文长度和前面找到的长度,如果更长就更新 max_length 和 start_index 的值。

进阶:本文使用 while 循环,在向右找到与标志位相同的连续字符时,标志位的索引 i 也加1,这样可以减少 while 的遍历次数,提高程序的运行效率,跑Leetcode上提供的用例可以缩短5倍左右的时间。(同时,在这种方式的循环中,不需要向左寻找与标志位相同的连续字符,代码不会执行到。上面还保留着向左寻找的代码,是为了与解题思路保持一致,方便理解。)


相关阅读

【PythonCode】这些题,不会做就选A

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

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

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

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

相关文章

微信小程序-侧滑删除

简介 movable-view和movable-area是可移动的视图容器&#xff0c;在页面中可以拖拽滑动。 本篇文章将会通过该容器实现一个常用的拖拽按钮功能。 使用效果 代码实现 side-view.wtml 布局见下面代码&#xff0c;left view为内容区域&#xff0c;right view为操作按钮&a…

ORACLE无法OPEN,处理三板斧

mount下先查询数据文件头的检查点是否一致 查询 v$datafile_header &#xff0c;CHECKPOINT_CHANGE#均一致&#xff0c;FUZZY为YES SQL> select file#, fuzzy, to_char(CHECKPOINT_CHANGE#) from v$datafile_header;1)对于open resetlogs时数据文件中有脏数据的情况&#x…

初探深度学习-手写字体识别

前言 手写数字的神经网络识别通常指的是通过训练有素的神经网络模型来识别和分类手写数字图像的任务。这种类型的任务是机器学习和计算机视觉领域的一个经典问题&#xff0c;经常作为入门级的图像识别问题来展示和测试各种机器学习算法的能力。在实际应用中&#xff0c;手写数…

Job for ssh.service failed because the control process exited with error code.

错误如下&#xff1a; Start operation timed out. Terminating.Failed to start openbsd secure shell server 或者是 Job for ssh.service failed because the control process exited with error code. 有统一的解决办法&#xff01; 先卸载SSH服务&#xff0c;然后删除缓存…

分享一些开源的游戏仓库

1.CnC_Remastered_Collection 红色警戒95版本 https://github.com/electronicarts/CnC_Remastered_Collection gitee仓库分流&#xff1a;https://gitee.com/loswdarmy/CnC_Remastered_Collection 2.Far-Cry-1-Source-Full 孤岛惊魂1 https://github.com/StrongPC123/Far-Cry-…

mac电脑总卡蓝屏是怎么回事,苹果电脑老卡蓝屏怎么办

电脑老卡蓝屏是比较常见的电脑故障之一&#xff0c;导致这一问题的出现很可能是电脑本身的硬件&#xff0c;或电脑上的驱动安装错误&#xff0c;没法运行&#xff0c;当然也不排除其他的一些因素。虽说电脑蓝屏是电脑几乎都会出现的小毛病&#xff0c;不足以致命&#xff0c;但…

安卓native编程

目录 如何在native中访问assets内容 如何在native中访问assets内容 Android: 在native中访问assets全解析

读书·基于RISC-V和FPGA的嵌入式系统设计

引言&#xff1a;第八届集成电路创新创业大赛龙芯杯是有关嵌入式SoC设计的 由于我本身是做纯硬件设计&#xff0c;此前没怎么接触软硬协同 玩过Zynq&#xff0c;但是到SDK部分就去吃灰了 现在后悔了&#xff0c;所以&#xff0c;做人一定要有始有终啊~TAT -------------------…

python 蓝桥杯之常用的库

文章目录 heapqCounter导入模块创建一个 Counter 对象获取元素的出现次数访问特定元素的计数更新计数获取计数值最高的元素其他常用方法 defaultdict导入模块创建一个 defaultdict(set)向字典中添加元素访问字典中的元素访问不存在的键注意事项 heapq heapq 是 Python 中的一个…

基于决策树实现葡萄酒分类

基于决策树实现葡萄酒分类 将葡萄酒数据集拆分成训练集和测试集&#xff0c;搭建tree_1和tree_2两个决策树模型&#xff0c;tree_1使用信息增益作为特征选择指标&#xff0c;B树使用基尼指数作为特征选择指标&#xff0c;各自对训练集进行训练&#xff0c;然后分别对训练集和测…

图论练习6

[NOIP2013]车站分级 Here 解题思路 由于起始点之间所选的站号&#xff0c;相互之间一定满足那么对于起始点间未选择的站号&#xff0c;一定满足选择的站号考虑用边来维护信息&#xff0c;表示的级别大于按题意&#xff0c;则车站会被分为几个联通块&#xff0c;且保证块内无环…

So you think you understand IP fragmentation?

文章目录 前言一、Why care?二、Prevention三、Well-understood?四、Introducing fragquiz五、A novel (?) algorithm六、Reader challenge七、traceroute八、ICMP参考资料 前言 本文来自&#xff1a;https://lwn.net/Articles/960913/ February 7, 2024This article was …

【Python】成功解决ModuleNotFoundError: No module named ‘seaborn’

【Python】成功解决ModuleNotFoundError: No module named ‘seaborn’ &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; …

高分辨率全球海洋温度和盐度再分析数据Global Ocean Physics Reanalysis(0.083°),并利用matlab读取绘图

1.引言 在研究全球海平面变化的问题中&#xff0c;卫星测高获得总的海平面变化&#xff0c;而海平面变化包含质量变化和比容变化。因此测高数据和海洋物理分析数据对于海平面研究至关重要。 测高数据下载网址&#xff1a; Global Ocean Gridded L 4 Sea Surface Heights And …

动态规划课堂4-----子数组系列

目录 引入&#xff1a; 例题1&#xff1a;最大子数组和 例题2&#xff1a;环形子数组的最大和 例题3&#xff1a;乘积最大子数组 例题4&#xff1a;乘积为正数的最长子数组 总结&#xff1a; 结语&#xff1a; 引入&#xff1a; 在动态规划&#xff08;DP&#xff09;子…

农场管理小程序|基于微信小程序的农场管理系统设计与实现(源码+数据库+文档)

农场管理小程序目录 目录 基于微信小程序的农场管理系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、用户信息管理 2、农场信息管理 3、公告信息管理 4、论坛信息管理 四、数据库设计 五、核心代码 七、最新计算机毕设选题推荐 八、源码获取&#x…

mysql和redis的区别

一.额外知识 1.为什么内存读取比硬盘读取快 在了解mysql和redis的区别之前,先来讨论一下额外的知识:为什么内存读取比硬盘读取快? 先看一个结论:内存读取至少比硬盘读取快10万倍 首先机械硬盘基本上的速度都在100MB-200MB 之间&#xff0c;SSD硬盘快一点,但是也是在500MB左右…

【工具使用-VScode】VScode如何设置空格和tab键显示

一&#xff0c;简介 在提交代码的时候&#xff0c;行末尾的tab和空格不符合规范&#xff0c;但是如果在vscode中不显示tab和空格的话&#xff0c;不能及时的查看到并改正&#xff0c;导致提交代码之后还需要再次进行修改&#xff0c;效率比较低。 代码编辑界面如图所示&#…

【大厂AI课学习笔记NO.68】开源和开源发展情况

开源即源代码公开&#xff0c;任何人能获取源代码&#xff0c;查看、修改、分发他们认为合适的代码。 依托同行评审和社区生成&#xff0c;旨在以分散、协作的方式开发。 我们曾经很详细的讨论过开源协议的问题&#xff0c;详细可以参考我的文章&#xff1a; https://giszz.…

CaricatureFace 学习笔记

目录 3d人脸重建开源项目汇总 CaricatureFace 依赖项&#xff1a; 有的电脑安装失败&#xff1a; 3d人脸重建开源项目汇总 3D人脸重建开源项目整理_reconstruction 项目-CSDN博客 2020 CVPR 漫画三维人脸重建) CaricatureFace 依赖项&#xff1a; openmesh 有的电脑安…