
(python刷题)leetcode 刷题
使用python进行leetcode刷题
Life will be better
这个作者很懒,什么都没留下…
展开
-
(python刷题)leetcode 第101题:对称二叉树
题目描述:解题思路:使用递归方法解题。首先我们来看一颗数镜像对称的条件是什么?一棵树要镜像对称,只需要它的左右两颗子树镜像对称即可,如下图所示。而要判断左右子树是否是镜像对称,其实就是要判断两颗树是否镜像对称。如下图所示,两颗树镜像对称需要满足以下条件:(1)它们的根节点相同(2)树1的左子树和树2的右子树镜像对称(3)树1的右子树和树2的左子树镜像对称这就转化到了递归问题,具体...原创 2020-04-18 17:24:53 · 472 阅读 · 0 评论 -
(python刷题)leetcode 第69题:x的平方根
题目描述:解题思路:求平方根的问题用牛顿法解题较好。牛顿法通过不断迭代求得方程的近似解。要求sqrt(a),相当于求函数f(x)=x2-a的正根,牛顿法的思路是先随便初始化一个点(xn,f(xn)),然后求函数在该点的切线与x轴的交点xn+1,则xn+1是比xn更加接近所求解的,依次迭代下去就可以得到近似解。下面用一张图较为直观的进行说明:图像的曲线方程为y=x2-a,为了求它的正根sq...原创 2020-04-17 12:49:40 · 592 阅读 · 0 评论 -
(python刷题)leetcode 第53题:最大子序列和
题目描述:解题思路:使用动态规划进行解题。用s表示包含当前元素nums[i]的最大和,result表示迄今为止的最大和,即s一定要包含nums[i],而result不一定包含nums[i]。初始化s=result=nums[0]如果s>0,说明s对于当前元素具有增益效果,则更新s=s+nums[i]如果s<=0,说明s对于当前元素不具有增益效果,则更新s=nums[i]...原创 2020-04-16 11:09:12 · 295 阅读 · 0 评论 -
(python刷题)leetcode 第35题:搜索插入位置
题目描述:解题思路:使用二分查找算法解题,但是要注意查到不到时的判断。具体步骤为:1、首先处理几种特殊情况。 当nums为空时,返回0 当target<nums[0]时,返回0 当target>nums[-1]时(即大于最大的数),返回len(nums)2、对一般情况进行处理。直接使用二分查找算法即可。初始化low=0,high=len(nums)-1,mid=...原创 2020-04-15 12:02:43 · 327 阅读 · 0 评论 -
(python刷题)leetcode 第29题:两数相除
题目描述:解题思路:不能使用乘除法,最容易想到的就是使用加法,比如被除数为10, 除数为3,则使用循环对3进行累加,循环相加的结果依次为6, 9, 12,由于9 <10<12那么就找到了最后的结果为3。但是这种方法的时间复杂度过高,它的时间复杂度为o(dividend//divisor)。那么怎么降低时间复杂度呢。我们可以使用每次循环都将除数翻倍的方法,比如对于被除数为10, ...原创 2020-04-14 12:22:58 · 372 阅读 · 0 评论 -
(python刷题)leetcode 第28题:实现 strStr()
题目描述:解题思路:使用朴素算法进行解题。即使用两个指针j,i,分别指向haystack和needle,初始化i=j=0,然后判断needle[i]是否等于haystack[j],如果等于,那么继续判断它们的下一个字符是否匹配,如果中途匹配失败,那么将j往后移一步,i重新置0,重复以上过程;如果needle的所有字符都匹配成功了,直接返回匹配成功的haystack的位置即可;如果j遍历完了h...原创 2020-04-13 10:37:27 · 251 阅读 · 0 评论 -
(python刷题)leetcode 第27题:移除元素
题目描述解题思路使用双指针进行解题。i=0为头指针,j=len(nums)-1为尾指针。当nums[i]等于val的时候,需要删除这个元素,那么就把nums[i]与nums[j]进行交换,然后使得j=j-1,以删除这个元素,而由于交换后的nums[i]有可能等于val,因此还需要对nums[i]进行检查,也就是说此时i不动。如果nums[i]不等于val,则使i向前移动一步即可。当j<...原创 2020-04-03 11:56:49 · 278 阅读 · 0 评论 -
(python刷题)leetcode 第26题:删除排序数组中的重复项
题目描述解题思路使用快慢指针进行解题。i=0开始为慢指针,j=1开始为快指针。使用j遍历数组,只有当nums[j]!=nums[i]时,i前进一步,再赋值nums[i]=nums[j]即可,最后返回i+1。python代码class Solution(object): def removeDuplicates(self, nums): """ :t...原创 2020-04-03 11:23:08 · 226 阅读 · 0 评论 -
(python刷题)leetcode 第25题:K 个一组翻转链表
题目描述解题思路将整个链表分为已翻转区,待翻转区和未翻转区三个部分初始化一个虚拟节点dummy,待翻转区的前驱节点pre和后继节点end初始化为pre=end=dummy通过循环找到待翻转区的范围,每循环一次,end向前走一步,循环k次后end就位于待翻转区的末尾节点,初始化start=pre.next就得到了待翻转区的范围[start, end]记录end的后一个节点next=en...原创 2020-04-02 12:12:26 · 267 阅读 · 0 评论 -
(python刷题)leetcode 第24题:两两交换链表中的节点
题目描述解题思路使用迭代法进行解题。用p1,p2表示当前的第一个和第二个节点,对p1和p2进行交换前要先保存p2的下一个节点p3=p2.next。此时对p1和p2进行交换。然后更新p1和p2,p1=p3,p2=p3.next,重复以上步骤直到全部节点交换完成即可。复杂度分析:由于只需要遍历一次链表,所以时间复杂度为o(n)由于只需要创建常数个节点,所以空间复杂度为o(1)pytho...原创 2020-04-01 16:22:11 · 268 阅读 · 0 评论 -
(python刷题)leetcode 第23题:合并K个排序链表
题目描述解题思路使用分治法进行解题。将所有链表进行两两分组,然后依次进行两两合并即可。复杂度分析:时间复杂度为Nlogk,其中N为所有链表的节点总数,k的链表数空间复杂度为o(1),每次合并两个链表时只需要创建两个指针即可。python代码# Definition for singly-linked list.# class ListNode(object):# def...原创 2020-04-01 12:41:31 · 204 阅读 · 0 评论 -
(python刷题)leetcode 第22题:括号生成
题目描述:解题思路:使用深度优先搜索的方法找到所有符合条件的答案。这里引用大佬的解题思路图,原图链接对于 n=2 的情况如下图所示。从图中可以看出,深度优先遍历的函数包含的步骤为:如果当前剩余的左右括号数都为0,则将当前的括号字符串添加进结果中如果当前剩余的左括号数量大于右括号数量,那么得到的括号字符串不符合条件,需要进行剪枝如果当前剩余的左括号数量大于0,则可进行左分支如...原创 2020-03-18 11:26:15 · 308 阅读 · 0 评论 -
(python刷题)leetcode 第21题:合并两个有序链表
题目在leetcode上的链接为:https://leetcode-cn.com/problems/merge-two-sorted-lists/题目描述解题思路使用归并排序的合并有序数组的思路即可。复杂度分析:需要遍历两个链表,时间复杂度为 o(m+n)只需要创建常数个指针变量,空间复杂度为 o(1)python代码# Definition for singly-linked...原创 2020-02-18 12:13:07 · 317 阅读 · 0 评论 -
(python刷题)leetcode 第20题:有效的括号
题目在leetcode上的链接为:https://leetcode-cn.com/problems/valid-parentheses/题目描述解题思路使用栈进行解题。遍历字符串,如果遇到左括号就入栈,遇到右括号就出栈并比较出栈的左括号是否与该右括号匹配,最后如果遍历完字符串且栈为空,说明字符串为有效括号。判断左右括号是否匹配可以使用 dict 建立括号的匹配关系:dic = {"(...原创 2020-02-18 11:14:00 · 522 阅读 · 1 评论 -
(python刷题)leetcode 第19题:删除链表的倒数第N个节点
题目在leetcode上的链接为:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/题目描述解题思路要实现一遍扫描解题,可以使用快慢指针的思想。要删除倒数第 n 个节点,那么需要找到倒数第 n+1 个节点才行。先初始化两个指针 p1=p2=head,然后让快指针 p1 先往前走 n 步,然后让 p2,p1 ...原创 2020-02-17 12:28:42 · 282 阅读 · 0 评论 -
(python刷题)leetcode 第18题:四数之和
题目在leetcode上的链接为:https://leetcode-cn.com/problems/4sum/题目描述解题思路这一题与第15题 三数之和 的解题思路类似。先对数组进行从小到大的排序,然后使用两重循环遍历数组,再使用双指针遍历一遍即可。具体步骤为:首先如果 nums 为 None,或者 nums 长度小于4,那么返回空列表将 nums 按照从小到大进行排序使用变量...原创 2020-02-17 11:22:03 · 279 阅读 · 0 评论 -
(python刷题)leetcode 第17题:电话号码的字母组合
题目在leetcode上的链接为:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/题目描述解题思路这是一个排序组合的问题,可以使用回溯法的思想解题。回溯法的思想是先自上到下,然后再一步步从下往上进行回溯。对于一个有多种解的问题,回溯法先按照其中的一种解法往最底层执行,执行完毕后再回到上一层执行...原创 2020-02-16 12:03:05 · 471 阅读 · 0 评论 -
(python刷题)leetcode 第16题:最接近的三数之和
题目在leetcode上的链接为:https://leetcode-cn.com/problems/3sum-closest/题目描述解题思路这一题与第15题 三数之和 类似。先对数组 nums 进行从小到大排序,然后使用双指针解题。我们使用 s 表示数组中三数之和,要求与 target 最接近的 s,就是求它们的差的绝对值 |s-target| 的最小值对应的 s,这其实就是一个简单...原创 2020-02-15 13:48:39 · 272 阅读 · 0 评论 -
(python刷题)leetcode 第15题:三数之和
题目在leetcode上的链接为:https://leetcode-cn.com/problems/3sum/题目描述解题思路首先想到的是使用暴力法解题,使用三重遍历遍历数组,然后判断三个数相加是否为0并去重即可,时间复杂度为 o(n3)。为了降低时间复杂度,我们可以将数组排序后再使用双指针的解法。具体步骤为:首先如果 nums 为 None,或者 nums 长度小于3,那么返回空...原创 2020-02-15 12:32:51 · 367 阅读 · 0 评论 -
(python刷题)leetcode 第14题:最长公共前缀
题目在leetcode上的链接为:https://leetcode-cn.com/problems/longest-common-prefix/题目描述解题思路解法一:暴力法。首先找到数组中字符串的最短长度,那么依次从前往后比较数组中的字符串的字符是否相同,遇到不同的字符时结束查找,即可找到最长前缀。ps:特别注意当数组长度为0时,返回 “”;当数组长度为1时,直接返回第一个字符串...原创 2020-02-14 11:29:06 · 269 阅读 · 0 评论 -
(python刷题)leetcode 第13题:罗马数字转整数
题目在leetcode上的链接为:https://leetcode-cn.com/problems/roman-to-integer/题目描述解题思路解题方法与第12题整数转罗马数字类似,使用哈希表来解题。以 key 为罗马数字,value 为对应的整数,建立7种单个字符和6种两个字符的罗马数字一共13种映射关系的哈希表: dic = {"M" : 1000, "CM" : 900,...原创 2020-02-13 13:23:01 · 456 阅读 · 0 评论 -
(python刷题)leetcode 第12题:整数转罗马数字
题目在leetcode上的链接为:https://leetcode-cn.com/problems/integer-to-roman/题目描述解题思路由于整数与罗马数字存在一种映射关系,所以我们可以建立哈希表来表示这种映射关系,哈希表中的 key 为整数,value 为对应的罗马数字(字符串)。我们将题目中的7种单个字符以及6种两个字符的特殊情况一共13种映射情况,按照对应的整数从大到...原创 2020-02-13 12:31:46 · 524 阅读 · 0 评论 -
(python刷题)leetcode 第11题:盛最多水的容器
题目在leetcode上的链接为:https://leetcode-cn.com/problems/container-with-most-water/题目描述解题思路首先很容易想到暴力法,只需要使用两重循环遍历起始位置元素 i,j,然后每遍历到以个位置时计算此时的盛水量 (j-i)*min(a[i],a[j]),并更新最大的盛水量即可。暴力法的时间复杂度为 o(n2)。那么有不有时间...原创 2020-02-12 12:08:46 · 413 阅读 · 0 评论 -
(python刷题)leetcode 第9题:回文数
题目在leetcode上的链接为:https://leetcode-cn.com/problems/palindrome-number/题目描述解题思路这里提供两种解法:解法一:转换为字符串的解法1.先判断特殊情况,即 x<0 或者 x能被10整除且x不为0这两种情况不是回文数2.否则将整数转化为字符串,然后再判断是否为回文字符串即可。复杂度分析:我们令 n 表示 le...原创 2020-02-11 14:02:30 · 422 阅读 · 0 评论 -
(python刷题)leetcode 第8题:字符串转整数
题目在leetcode上的链接为:https://leetcode-cn.com/problems/string-to-integer-atoi/题目描述解题思路这一题直接按照题目的流程去解题即可,算法步骤为:找到第一个非空格出现的位置从该位置开始遍历字符串,并用一个列表储存该位置开始的有效数字,直接遍历到第一个非有效数字结束将列表转化为字符串后再使用 int 函数转化为整数,判...原创 2020-02-10 11:50:43 · 353 阅读 · 0 评论 -
(python刷题)leetcode
使用 python3 进行leetcode top100的刷题,每一题都详细讲解了题目的解题思路以及 python 代码,题目数量正在持续更新中哦!下面是相应的题目以及解题思路和 python 代码:题目解题思路以及 python 代码第1题:两数之和两数之和第2题:两数相加两数相加第3题:无重复字符的最长子串无重复字符的最长子串第4题: 寻找两个有...原创 2020-02-09 11:59:43 · 380 阅读 · 1 评论 -
(python刷题)leetcode 第7题:整数反转
题目在leetcode上的链接为:https://leetcode-cn.com/problems/reverse-integer/题目描述解题思路先将整数转化为字符串,然后进行字符串的反转,再将反转后的字符串转化为整数即可。注意判断反转后的整数是否溢出。ps:1.在 python2 中,整数类型的范围与机器的位数有关,32位机器中整数类型的范围为 −231-2^{31}−231~2...原创 2020-02-09 11:43:00 · 487 阅读 · 0 评论 -
(python刷题)leetcode 第6题:z字形变换
题目在leetcode上的链接为:https://leetcode-cn.com/problems/zigzag-conversion/题目描述解题思路我们可以按照行号来推算每一行中的下一个字符的位置,从而得到最终的答题。首先对于每一行的第一个元素我们都是知道的,而z字形图案是按照z为一个周围进行重新的图案,所以我们只需要推算出一个周期内每一行中的两个相邻元素之间的距离,即可根据每一行...原创 2020-02-08 13:29:00 · 512 阅读 · 1 评论 -
(python刷题)leetcode 第5题:最长回文子串
题目在leetcode上的链接为:https://leetcode-cn.com/problems/longest-palindromic-substring/题目描述解题思路首先要理解什么是回文字符串,回文字符串是指正着读和反着读都一样的字符串,如 ababa,它具有对称性。因此每一个回文字符串都存在一个对称中心,离对称中心向左和向右的相同距离位置的字符都是相同的,因此可以使用中心展开...原创 2020-02-06 18:20:19 · 653 阅读 · 0 评论 -
(python刷题)leetcode 第4题:寻找两个有序数组的中位数
解题思路如果题目没有限制时间复杂度为 o(log(m+n))的话,那么就可以用归并排序的合并有序数组的方法解题,此时时间复杂度为 o(m+n)。要求时间复杂度o(log(m+n)),那么容易想到的就是使用二分法的思想解题。首先我们要明确中位数的作用,中位数将一个数组划分为两个部分,这两个部分的特点是:两个部分的长度相同左边的元素都要小于等于右边的元素回到题目,要求两个有序数组 A...原创 2020-02-05 12:48:34 · 514 阅读 · 0 评论 -
(python刷题)leetcode 第3题:无重复字符的最长子串
题目在leetcode上的链接为:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/题目描述解题思路使用滑动窗口的思想解题。滑动窗口一般在字符串或者数组中比较常用,窗口的示例为 [i, j)(左开右闭),窗口中元素的个数(窗口的长度)为 j - i,滑动窗口即i或者j可以向左右滑...原创 2020-02-04 11:50:21 · 578 阅读 · 0 评论 -
(python刷题)leetcode第2题:两数相加
题目在leetcode上的链接为:https://leetcode-cn.com/problems/add-two-numbers/题目描述解题思路将链表中对应节点数字进行相加的操作,同时注意考虑进位问题即可。具体的做法如下:初始化进位数carry=0初始化p1,p2分别为l1,l2的头节点循环判断当p1或者p2不为空时如果p1不为空,则将p1节点的值赋给x,如果p1为空,则进行...原创 2020-02-03 12:47:52 · 299 阅读 · 1 评论 -
(python刷题)leetcode 第1题:两数之和
题目在leetcode上的链接为:https://leetcode-cn.com/problems/two-sum/题目描述解题思路使用dict来做,时间复杂度为o(n),空间复杂度为o(n)1.将列表nums中的元素值作为key,元素对应下标作为value,建立dict2.遍历列表nums元素a,判断b = target-a是否在dict中,如果b在dict中且a,b的下标不同,输...原创 2020-01-31 13:16:44 · 333 阅读 · 0 评论