![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leedcode
futurewq
活到老,学到老
展开
-
leedcode 二叉树的层次遍历
利用队列保存每层的节点,利用一个辅助列表来保存当前层的所有孩子节点。当当前层遍历结束之后,该层的所有孩子节点也会被全部保存再辅助列表中,然后将这个辅助列表赋值给队列。依次循环直到遍历完整棵树。# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# ...原创 2019-09-27 10:42:39 · 108 阅读 · 0 评论 -
leedcode 全排列
使用回溯法,考虑全排列的构成,假设有子数组的全排列[1,2],加入3就有3中加法,从而得到三个数组,分别是[3,1,2],[1,3,2],[1,2,3].所以利用回溯法得到子数组的全排列,然后将数组中的剩余的那个数字加到0到n的为之中,从而产生不同的全排列。class Solution(object): def permute(self, nums): """ ...原创 2019-09-20 21:33:35 · 87 阅读 · 0 评论 -
leedcode 字符串相乘
首先将两个字符串转成数字,然后计算这两个数字之间的乘积,然后将乘积转成字符串。要注意在乘积转成字符串时要考虑字符的表示的范围大小,所以需要一位一位转换数字。先将数字转换到字符数组中,然后用join操作链接起来即可class Solution(object): def multiply(self, num1, num2): """ :type num...原创 2019-09-20 20:56:51 · 86 阅读 · 0 评论 -
leedcode 字符串转换整数
这里要求字符串的第一个非空字符要不是正负号要不是数字,所以先把源字符串的前面的空字符清空。然后在新的字符串中判断首字符是否是正负号或者数字,如果不是则直接返回。否则就计算字符对应的数值大小,在计算过程中如果发现了数字以外的字符则立即返回,因为题目中要求连续的数字字符。还需要注意的是,在返回自己计算的数值时,都需要判断数值是否在允许范围内。class Solution(object): ...原创 2019-09-20 20:45:47 · 81 阅读 · 0 评论 -
leedcode 最长回文子串
使用动态规划法,构建转移矩阵,对于单个字符其dp肯定为1,对于包含两个字符的字符串,如果这两个字符相等则该zi字符串是回文串。以此类推,要使dp[i][j]=1则必须满足s[i]==s[j] and dp[i+1][j-1]==1,即如果子串s[i+1:j]是回文串又字符串的首字符和尾字符相等,则字符串s[i:j+1]一定是回文串。不过python超时。class Solution(ob...原创 2019-09-20 20:01:32 · 85 阅读 · 0 评论 -
leedcode 环形链表II
设置快慢指针,确定是否有环。如果有环,确定环中节点的数量。然后再根据快慢指针去找,找到环的入口点。# Definition for singly-linked list.# class ListNode(object):# def __init__(self, x):# self.val = x# self.next = Nonecla...原创 2019-09-19 21:26:34 · 71 阅读 · 0 评论 -
leedcode
使用快慢指针,如果由环,那么快指针会和慢指针指向同一个节点。# Definition for singly-linked list.# class ListNode(object):# def __init__(self, x):# self.val = x# self.next = Noneclass Solution(object)...原创 2019-09-19 19:18:21 · 84 阅读 · 0 评论 -
leedcode
使用快慢指针,如果由环,那么快指针会和慢指针指向同一个节点。# Definition for singly-linked list.# class ListNode(object):# def __init__(self, x):# self.val = x# self.next = Noneclass Solution(object)...原创 2019-09-19 19:17:01 · 76 阅读 · 0 评论 -
leedcode 旋转链表
将链表的首尾相连,然后新链表的头结点,断开即可# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def rotateRi...原创 2019-09-17 20:04:52 · 92 阅读 · 0 评论 -
leedcode合并两个有序链表
构建一个新链表,遍历这两个有序链表,将较小值加入到新链表。直到两个有序链表至少有一个遍历结束为止。对于没有遍历完的有序链表,将其剩余的元素加入到新链表的后面、# Definition for singly-linked list.#class ListNode:# def __init__(self, x):# self.val = x# s...原创 2019-09-16 18:48:04 · 75 阅读 · 0 评论 -
leedcode 两数相加
从个位数开始相加,需要考虑进位。用count来记录需要进位的数值。这里需要注意的是在相加的过程中,新链表会一直往后遍历以至于找不到新链表的头,所以要做好保存工作,在该题中用pNew保存新链表的头部信息,其实该新链表的头部是从第二个节点开始的# Definition for singly-linked list.# class ListNode:# def __init__(s...原创 2019-09-15 17:44:28 · 92 阅读 · 0 评论 -
leedcode 反转链表
使用三个指针,第一个指针指向原始链表的前驱结点,一个指针指向当前节点,一个指针指向原始链表的后继节点。在反转链表中,让当前节点指向前驱结点。然后为了防止找不到原始链表中剩余的节点,所以保存了yu原始链表的后继节点。当当前节点更新了自己的next节点之后,这三个指针依次往后移。知道指向原始链表的后继节点为空时,整个链表遍历完成,得到反转链表,当前节点指向的是反转链表的头节点。# Defin...原创 2019-09-20 21:43:02 · 103 阅读 · 0 评论 -
leedcode 爬楼梯
这个其实是个递归的思路,因为每次可以爬一阶和两阶,爬n个台阶的楼梯的方法等于爬n-1个台阶的方法加上爬n-2个台阶的方法。当只有一个台阶的时候方法是1,当有两个台阶的时候方法是2,分别是一次爬两个台阶,和爬两个一阶。如果从n开始倒着递归可能会存在重复计算,所以可以从1开始计算一直计算到n,得到n阶台阶的方法数。class Solution(object): def climbSt...原创 2019-09-21 19:00:57 · 90 阅读 · 0 评论 -
leedcode 格雷编码
格雷编码xi相邻编码只有一位不同,观察格雷编码1:0,12:00,01,11,103:000,001,011,010,110,111,101,1004:0000,0001,0011,0010,0110,0111,0101,0100,1100,1101,1111,1110,1010,1011,1001,1000可以看出格雷编码的一些规律,以三位的格雷编码为例,它由两部分构成,...原创 2019-09-21 19:52:36 · 209 阅读 · 0 评论 -
leedcode x的平方根
使用二分查找class Solution(object): def mySqrt(self, x): """ :type x: int :rtype: int """ if x <= 1: return x left = 0 right =...原创 2019-09-27 10:02:13 · 95 阅读 · 0 评论 -
leedcode 全排列
使用回溯法,思考啊。。大概是所有全排列形成的过程是这样。以1,2,3的全排列为例。class Solution(object): def permute(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ res =...原创 2019-09-26 20:28:18 · 99 阅读 · 0 评论 -
leedcode 子集II
这个和第一个子集不同的地方是数组中存在重复元素,仍然使用回溯法。将原始的数据排序,仍然使用第一个子集题的代码,只是每次在加入到res数组时判断数组中是否已经包括了这个子集,但是这种判断操作比较费时,在leedcode尝试过。我们使用另外一种判断方式,就是如果当前的元素和前一个元素是相同的,那么就跳过,没有比较计算以当前元素开头的子集,因为在上一个元素开头的子集中一定已经包含了这些子集。重点还是...原创 2019-09-26 20:02:12 · 96 阅读 · 0 评论 -
leedcode 丑数II
考虑动态规划法,因为要找出第n个丑数,所以我们可以从第一个开始依次生成丑数,直到生成第n个即可。但是一定要保证丑数序列是单调递增的。丑数都是由2,3,5组成,所以如果有一个数是丑数,那么乘以2或乘以3或乘以5仍然是丑数。所以依据这个特性,记录p2,p3,p5三个指针用来指示打算要乘以的那个丑数,然后计算这三个指针乘以对应的丑数的最小值,就是当前位置的丑数,记得要更新p2,p3,p5,如果p2,...原创 2019-09-24 21:05:19 · 94 阅读 · 0 评论 -
leedcode 买卖股票的最佳时机II
考虑动态规划,只要第二天的价格贵,那卖了就是赚了,所以转移方程为dp[i] = dp[i-1] if prices[i-1] >= prices[i] else dp[i-1] + prices[i] - prices[i-1] if prices[i-1] < prices[i]class Solution(object): def maxProfit(self...原创 2019-09-24 20:34:31 · 92 阅读 · 0 评论 -
leedcode 最长上升子序列
动态规划,利用dp来保存到第i元素为止最大的上升子序列长度。首先对dp初始化,每个位置上的值初始化为1,即到每个元素为止至少有本身这样一个序列。在更新dp的过程中。例如更新dp[i]遍历j令其等于0到i-1,如果nums[j]<nums[i],则加入第i个元素可以构成一个新的上升子序列,dp[i]=dp[j]+1。但是可能有很多的子序列可以和第i个元素构成上升子序列,我们需要选择上升...原创 2019-09-24 19:56:02 · 79 阅读 · 0 评论 -
leedcode 反转字符串中的单词 III
根据空格将字符串转成列表形式,然后遍历列表,反转每一个字符串,要注意字符串在python中是不可变对象,所以不能用交换操作在源字符串上修改,可以适用字符串的切片方法得到反转字符串,slice[start:end:step]如果start为:则为从头开始,end为:遍历为尾部,step是步长。s[::-1]得到反转字符串。通过设置步长为负数来反转字符串。最后利用空格将列表转换成字符串。cl...原创 2019-09-21 20:49:29 · 102 阅读 · 0 评论 -
leedcode 反转字符串
反转字符串,原地工作,其实就是第一个元素与倒数第一个元素交换,倒数第二个元素与倒数第二个元素交换。得到字符串中间元素的下表,偶数个和奇数个均适用。然后从0循环到中间元素的下标,i需要交换的下标为len_s - i - 1.class Solution(object): def reverseString(self, s): """ :type s:...原创 2019-09-21 20:25:22 · 111 阅读 · 0 评论 -
leedcode 删除链表中的节点
单纯从链表角度去思考,要删除链表中的节点,在遍历链表寻找需要删除的节点时,需要保存该节点的前驱结点,然后找到之后,li令该节点的前驱结点的next等于该节点的ho后继节点。但是从这道题出发,因为这道题的链表定义问题,只给了这个链表只要删除的节点。整个链表只给了需要删除的节点,我们就只能访问该节点之后的节点,所以我们直接让该节点的val保存其后继节点的值,然后删除后继节点,就是删除了该节点。...原创 2019-09-21 20:17:18 · 112 阅读 · 0 评论 -
leedcode 相交链表
首先要找两个链表的相交节点,那就要保证从相交节点开始其元素个数相同,否则肯定不是相交节点。所以先通过遍历长链表使其剩余元素与短链表相等。然后同时遍历两个链表,找到两个节点相等的位置,该节点即为相交节点,这里要注意我们应该比较两个节点而不是两个节点的值,因为我们要保证其值不仅相同还要让其指向的next相同,其next相同说明其指向了同一个节点,那这个又保证了其后继节点的后继又是同一个节点,以...原创 2019-09-21 20:08:37 · 90 阅读 · 0 评论 -
leedcode 除自身以外数组的乘积
使用两个辅助数组,一个保存某个元素左边所有元素的乘积,一个保存某个元素右边所有元素的乘积。最终根据这两个辅助数组来得到最终结果数组。class Solution: def productExceptSelf(self, nums: List[int]) -> List[int]: left = [] right = [] le...原创 2019-09-15 17:17:44 · 77 阅读 · 0 评论 -
leedcode 数组中重复数字
class Solution: def containsDuplicate(self, nums: List[int]) -> bool: set_list = set(nums) if len(set_list) == len(nums): return False else: r...原创 2019-09-12 20:26:22 · 125 阅读 · 0 评论 -
leedcode 寻找两个有序数组的中位数
放一个简单易理解想法:代码class Solution: def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float: len1 = len(nums1) len2 = len(nums2) size = len1 + ...原创 2019-08-28 16:38:28 · 84 阅读 · 0 评论 -
leedcode 柠檬水找零
需要注意的是,遇到20,我们更愿意做出更少的改变,即优先找10和5,如果没有再考虑找3张5.class Solution(object): def lemonadeChange(self, bills): """ :type bills: List[int] :rtype: bool """ five...原创 2019-08-14 21:40:09 · 84 阅读 · 0 评论 -
leedcode 从先序与中序遍历序列构造二叉树
# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution(object): ...原创 2019-08-14 21:12:39 · 95 阅读 · 0 评论 -
leedcode 从中序与后序遍历序列构造二叉树
# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution(object): ...原创 2019-08-14 21:11:13 · 86 阅读 · 0 评论 -
leedcode 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树:root =[3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,...原创 2019-08-19 21:53:44 · 108 阅读 · 1 评论 -
leedcode 二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树:root =[6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root =...原创 2019-08-19 21:29:10 · 78 阅读 · 0 评论 -
leedcode 二叉树中最大路径和
给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 6示例2:输入: [-10,9,20,null,null,15,7] -10/ \9 20...原创 2019-08-19 21:17:32 · 81 阅读 · 0 评论 -
leedcode 二叉树的最大深度
# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution(object): ...原创 2019-08-14 20:44:27 · 88 阅读 · 0 评论 -
leedcode 二叉搜索树中第k小元素
给定一个二叉搜索树,编写一个函数kthSmallest来查找其中第k个最小的元素。说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。示例 1:输入: root = [3,1,4,null,2], k = 1 3 / \1 4 \ 2输出: 1示例 2:输入: root = [5,3,6,2,4,null,null,1],...原创 2019-08-19 20:50:23 · 80 阅读 · 0 评论 -
leedcode 分发饼干
class Solution(object): def findContentChildren(self, g, s): """ :type g: List[int] :type s: List[int] :rtype: int """ max_nums = 0 g.sor...原创 2019-08-13 23:35:11 · 79 阅读 · 0 评论 -
leedcode LRU缓存机制
解题思路:字典用来保存key与value之间的关系,list用来保存最近最少使用机制,最近使用的放在最前面class LRUCache: def __init__(self, capacity: int): self.maxlength = capacity self.array = {} self.array_list = ...原创 2019-08-28 16:43:31 · 74 阅读 · 0 评论 -
leedcode Nim 游戏
数学方面的把,大概就是说如果是4块石头,先手方怎么也不会赢class Solution: def canWinNim(self, n: int) -> bool: if n % 4 == 0: return False else: return True...原创 2019-08-28 16:45:05 · 75 阅读 · 0 评论 -
leedcode 删除排序数组中的重复项
使用两个指针,i和number,i用来遍历原始数组,number用来保存不重复元素的数量。最开始让number=0,第一个不重复元素就是数组中的第一个元素,然后从数组中的第二个元素开始和number下标对应的元素比较,如果相等则说明是重复项不处理,如果不相等,则number++,将数组i处的元素添加到number位置。代码:class Solution: def remove...原创 2019-08-30 21:35:06 · 82 阅读 · 0 评论 -
leedcode 买卖股票的最佳时机
我们当然希望在最便宜的时候买入股票,所以我们用一个变量来保存股票最便宜的价格。用另一个变量保存最大的利润值。class Solution: def maxProfit(self, prices: List[int]) -> int: if len(prices) == 0: return 0 min_price = p...原创 2019-09-12 20:20:01 · 99 阅读 · 0 评论