![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法-leetcode
fairy净
这个作者很懒,什么都没留下…
展开
-
leetcode5 最长回文子串
'''递推式:1 一般: S[i+1] == S[j-1] and j>i and j-i == len(S[i+1,j-1])2 初始化dp矩阵对角线的值为 true,相邻两个元素相等时dp[i][i+1] 为true ,初始化回文串起始位置和长度。'''def longestPalindrome(s): n = len(s) if s == '': ...原创 2018-10-27 12:06:22 · 146 阅读 · 0 评论 -
leetcode 120. 三角形最小路径和
def minimumTotal(triangle): """ 从下往上递推 一维动态规划 先保存最后一行元素作为初始值,再往上依次递推, 递推式:tmp[j] = min(tmp[j],tmp[j+1])+triangle[i][j] 其中i表示第i行,从n-2行开始,三角形有规律每行元素的个数=第几行+1(0行开始) """ n = l...原创 2018-10-05 19:51:32 · 86 阅读 · 0 评论 -
leetcode 204. 计数质数
def countPrimes(self, n): """ list[i:j:m] 表示[i,j]之间索引是m的倍数的值 """ if n == 1 or n == 2: return 0 primes = [True] * n primes[0] = primes[...转载 2018-10-04 22:22:23 · 193 阅读 · 0 评论 -
leetcode263 & 264丑数
leetcode264def nthUglyNumber(self, n): """ 找到前n个丑数,每次新增到丑数比之前丑数数组的最大值都大,保证这一点,再确保每个与2 3 5 相 乘的数不重复,定义三个指针。 """ if n == 1: return 1 ...原创 2018-10-04 21:24:23 · 259 阅读 · 0 评论 -
leetcode141. 环形链表 & 142 环形链表 II
def hasCycle(self, head): """ 注意边界越界的问题 设置一个快指针和慢指针,慢指针和快指针相遇就存在环,如果有存在节点的next为None的情况没有环。 """ if not head: return False if not head.next o...原创 2018-10-04 19:05:38 · 110 阅读 · 0 评论 -
leetcode 74. 搜索二维矩阵 &240. 搜索二维矩阵 II
def searchMatrix(self, matrix, target): """ 容易出错的地方:二分查找的low<=high的条件 二维数组转化为一维数组的方法: 1.extend 循环n行 2.普通的二层循环 3. eval 表达式转化 去掉[] ... ...原创 2018-10-04 16:57:02 · 340 阅读 · 0 评论 -
leetcode206反转链表 & 92反转链表II
def reverseList(self, head): """ 头插法 """ first = ListNode(0) ###新建链表的头指针 p = first ###保存头指针用于最后返回 while head: t = head.next he...原创 2018-10-04 16:51:08 · 81 阅读 · 0 评论 -
leetcode102. 二叉树的层次遍历 &111&104&107
def levelOrder(self, root): """ 和普通的层次遍历不一样的地方是输出结果是每层一个列表的形式 """ if not root: return [] res = [] arr = [] stack = [root] ####存放每一...原创 2018-10-04 10:07:29 · 184 阅读 · 0 评论 -
leetcode19 删除倒数第n个节点
def removeNthFromEnd(self, head, n): """ 定义两个指针,表示两个元素的间隔,间隔大小固定为n-1,两个指针分别为pre,end """ pre = head end = head for _ in range(n): end = end....转载 2018-10-03 22:48:19 · 90 阅读 · 0 评论 -
leetcode160. 相交链表
def getIntersectionNode(self, headA, headB): """ 核心是理解相交链表的定义:如果相交后面的链表相等即是同一个 """ l1,l2 = self.len(headA),self.len(headB) n = l1 - l2 if n > 0:###...原创 2018-10-03 22:05:55 · 118 阅读 · 0 评论 -
leetcode 479用 Rand7() 实现 Rand10()
rand7()表示随机等概率的产生1-7之间的任一个数要用rand7产生rand10可以考虑用七进制转化为十进制扩大数字范围,基本思路是产生randN,N是10的倍数。class Solution: def rand10(self): """ 最后的返回结果记得加1 """ res = self.rand40() ...原创 2018-10-06 12:01:34 · 946 阅读 · 0 评论 -
leetcode88. 合并两个有序数组
def merge(self, nums1, m, nums2, n): """ 关键点是nums1原数组的长度是m+n,肯定要在nums1上操作效率高 如果正向比较的话移动次数很多,逆向的话不需要移动 注意m,n是以1开头的 """ while m > 0 and n > 0: ...原创 2018-10-06 13:20:49 · 170 阅读 · 0 评论 -
leetcode53 最大子序和 &leetcode 152 乘积最大子序列【都要求是连续的】
leetcode53def maxSubArray(self, nums): """ 最大和的连续子数组(子数组最少包含一个元素),返回其最大和 """ max_num = -2147483648 sum = 0 for j in range(len(nums)): sum...原创 2018-10-27 05:05:07 · 164 阅读 · 0 评论 -
leetcode 10
def trap(self, height): """ left_max 存左边最大的值 right存右边最大的值 left < right left移动 否则right移动 """ if not height: return 0 left,right,res = 0,...原创 2018-10-20 20:28:40 · 274 阅读 · 0 评论 -
leetcode10
def isMatch(s, p): m,n = len(s),len(p) dp = [[False for i in range(m+1)] for j in range(n+1)] dp[0][0] = True for i in range(0,n): for j in range(1,m): if s[j] == ...原创 2018-10-20 19:08:07 · 322 阅读 · 0 评论 -
leetcode77组合
def _combine(self, n, k, start, nums, result): if len(nums) == k: result.append(nums.copy()) return # k - len(nums) for i in range(start, n - (k -...原创 2018-10-19 17:44:38 · 136 阅读 · 0 评论 -
leetcode404 左叶子之和
def sumOfLeftLeaves(self, root): """ 判断左叶子节点是难点 """ res = 0 if not root: return 0 if root.left and not root.left.left and not root.left.ri...原创 2018-10-18 22:01:17 · 132 阅读 · 0 评论 -
leetcode 112. 路径总和
def hasPathSum(self, root, sum): """ 1.判断条件:如果判断sum==0为true,会出现不是叶子节点的情况 2.判断条件是叶子节点的val == sum """ if not root: return False if not root.l...原创 2018-10-18 21:40:02 · 101 阅读 · 0 评论 -
leetcode376摆动序列
def wiggleMaxLength_two(nums): ''' up[j]表示当前元素较上一个元素是升序状态,所以要找到与升序状态之前最近的逆序的状态的长度down[j-1],到i时当前序列的最长的摆动数组的长度 down[j]表示当前元素较上一个元素是逆序的长度,到i时当前序列的最长的摆动数组的长度 空间复杂度是O(n2) ''' n = ...原创 2018-09-30 10:43:27 · 377 阅读 · 0 评论 -
leetcode100. 相同的树
def isSameTree(self, p, q): """ 递归实现: 边界条件的判断: 1.如果都为空 返回true 2.如果其中一个为空另一个不为空,返回false 3.如果val值不相等返回空 """ if not p and not q: ...原创 2018-10-18 19:30:48 · 99 阅读 · 0 评论 -
leetcode226. 翻转二叉树
def invertTree(self, root): """ 递归实现 """ if not root: return None t = root.left root.left = root.right root.right = t self....原创 2018-10-18 19:06:27 · 104 阅读 · 0 评论 -
leetcode 104二叉树的最大深度 & 111二叉树最小深度
def maxDepth(root): """ 非递归,用栈表示,stack栈存储节点 """ if not root: return 0 count = 0 stack = [root] ####存放每一层的子节点 tmp = [] ###临时存放每一层的...原创 2018-10-18 18:55:52 · 122 阅读 · 0 评论 -
leetcode445. 两数相加 II---头插法
头插法:每次插入节点从头节点插入尾插法:每次插入节点从尾节点插入def addTwoNumbers(self, l1, l2): """ 注意 1.初始化的是头节点,最后的结果要返回头节点的next 2.节点的插入的时候注意顺序,箭头指向哪个哪个在等号的右边 主要思想是头插法构建链表 ...原创 2018-10-03 21:37:25 · 636 阅读 · 0 评论 -
leetcode147对链表进行插入排序
def insertionSortList(self, head): """ 对链表进行插入排序,单链表没有前驱指针只能从前往后,添加一个辅助有序链表,依次从前比较 """ new_head = ListNode(0) ###新链表的头指针 new_t = new_head cur = head ...原创 2018-10-03 20:26:19 · 201 阅读 · 0 评论 -
leetcode 148对链表进行排序
def sortList(self, head): ''' 1. 先把单链表的值存起来排序, 2. 再生成有序链表 ''' listL = [] p = cur = head while cur: listL.append(cur.val) ...原创 2018-10-03 17:28:19 · 78 阅读 · 0 评论 -
leetcode 62 不同路径
时间复杂度O(n2)def uniquePaths(m, n): """ 计算路径的个数 """ memo = [[0 for j in range(n)] for i in range(m)] for i in range(m): for j in range(n): if i == 0 and j == 0:...原创 2018-09-19 11:59:29 · 474 阅读 · 0 评论 -
leetcode 64最小路径和
时间复杂度O(n2)def minPathSum(self, grid): """ :type grid: List[List[int]] :rtype: int 递推式:memo[i][j] = min(grid[i][j] + memo[i-1][j],grid[i][j] + memo[i][j - 1]) ...原创 2018-09-19 10:39:55 · 123 阅读 · 0 评论 -
letcode 198 & 213 强盗抢劫
198 从前往后递推def rob(nums): """ :type nums: List[int] :rtype: int 198 递推式:dp[i] = max(dp[i-2]+nums[i],dp[i-1]) """ if not nums: return 0 ...原创 2018-09-19 10:31:14 · 149 阅读 · 0 评论 -
leetcode 35 搜索插入位置
1.常规解法遍历数组def searchInsert(nums, target): for i in range(len(nums)): for i in range(len(nums)): if nums[i] == target: return i elif nums[i] > ...原创 2018-09-08 19:33:41 · 126 阅读 · 0 评论 -
leetcode300 最长上升子序-----LIS
'''区分LCS,LCS是比较两个字符串的最长公共子序列,LSI是一个字符串的最长上升子序列。'''def lengthOfLIS(nums): ''' 思路:cache[i]表示第i个元素时的最长上升子序列的长度,(因为要走到序列的最后才能直到最长的子序列,所以i表示末尾元素,j表示末尾元素前面的元素) 时间复杂度O(n*n) 1. 子序列是可以不连续...原创 2018-09-08 19:31:55 · 172 阅读 · 0 评论 -
leetcode 14 最长公共前缀
class Solution(object): def longestCommonPrefix(self, strs): """ 首先理解最长公共前缀: 普通解法:首先取第一个字符串做为比较目标,遍历所有字符串,只要遇到不相等就停止 """ prefix = '' i = 0 ...原创 2018-09-08 15:13:03 · 91 阅读 · 0 评论 -
leetcode 3 无重复字符的最长子串& leetcode209 长度最小的子数组 连续
字串必须是连续,区别最长重复子序列LCS,子序列可以不是连续的。字符串用dp,求重复出现的字符的距离。DP求的时候适合只求无重复字符的最长子串的长度,双指针方法可以求长度也可以方便的最长的子串结果。DP两个辅助变量:1.遍历过的字符作为一个字符串;2. dp数组,dp[i]表示末尾是i的元素的最长不重复子串的长度。双指针:辅助变量一个字典 def lengthOfLonge...原创 2018-09-08 14:28:13 · 243 阅读 · 0 评论 -
leetcode 718最长重复子数组【连续】 - DP&LCS leetcode583. 两个字符串的删除操作 最长重复子序列【不连续】
'''最长重复子数组 子数组是连续的 类似LCS ,LCS是不要求连续的递推式:A[i] = B[j]时:memo[i][j] = memo[i-1][j-1] + 1第一行或第一列,A[i] = B[j]时:memo[i][j] = 1 其他情况 memo[i][j] = 0LCS 递推式:字符串A BA[i] = B[j]时:LCS[i,j] = LCS[i-1,j-...原创 2018-09-08 14:02:43 · 535 阅读 · 0 评论 -
编辑距离--Levenshtein 【leetcode 72】
def levenshtein(s,t): ''' 递推式:默认权重为1 初始化条件:第0行第0列分别为[0-m,0-n] if s[i][j] == t[i][j] :memo[i][j] = memo[i-1][j-1] if s[i][j] != t[i][j] :memo[i][j] = min(memo[i-1][j-1]+1,memo[i][j...原创 2018-09-08 13:14:13 · 161 阅读 · 0 评论 -
leetcode198&213 打家劫舍
解题思路:先画树形结构去分析,【x,n】表示考虑从x到n范围内去偷盗,memo[x,n]表示x到n范围内偷盗金额的最大值。def rob_198(nums): if len(nums) == 0: return 0 if len(nums) == 1: return nums[0] if len(nums) == 2: ...原创 2018-08-05 20:52:50 · 109 阅读 · 0 评论 -
拓扑排序的应用---leetcode207 课程表
拓扑排序是有向无环图的应用,由偏序定义得到拓扑有序的操作叫做拓扑排序,拓扑有序是全序。进行拓扑排序的方法:1.在有向图中选一个入度为0 (即没有前驱)的节点输出2.从图中删除该节点和以它为起点的依赖关系3.直到全部节点输出或者当前不存在无前驱的节点为止(这种情况说明存在环)。代码出自 http://www.zhufangxing.com/2015/05/01/leetcode-...原创 2018-06-06 15:57:00 · 564 阅读 · 0 评论 -
leetcode 413 等差数组划分
A[i] - A[i-1] == A[i-1] - A[i-2]def numberOfArithmeticSlices(A): n = len(A) if n < 3: return 0 ''' A[i] - A[i-1] = A[i-1] - A[i-2] ''' dp = [0 for i in range(n)]...原创 2018-09-19 13:55:47 · 121 阅读 · 0 评论 -
leetcode343 分隔整数的最大乘积
def integerBreak(self, n): """ dp[i]表示i的最大乘积是多少,遍历i之前的的范围(1,i-1)相乘找最大值 """ dp = [0 for i in range(n+1)] dp[1] = 1 for i in range(2,n+1): ...原创 2018-09-19 15:23:16 · 211 阅读 · 0 评论 -
leetcode 21 合并两个有序链表
def mergeTwoLists(self, l1, l2): ''' 新建一个链表,头指针保存,用来存储新的有序链表 ''' if not l1 and not l2: return None head = ListNode(0) ###定义链表的头指针 first = ...原创 2018-10-03 16:59:55 · 396 阅读 · 0 评论 -
leetcode46全排列
''' 非递归实现 index表示生成index+1大小的临时数组作为子数组 index从1开始,到原始数组的长度 ''' if len(nums) <= 1: return [nums] result = [[nums[0]]] index = 1 while index < len(nums...转载 2018-10-02 19:40:07 · 142 阅读 · 0 评论