自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 【leetcode】11 盛最多水的容器

题目分析双指针指向容器的两边,计算当前容积。因为容积的计算是高度较低的一边和底的长度决定的,所以移动低的边让容器有更大容积的可能。代码class Solution(object): def maxArea(self, height): """ :type height: List[int] :rtype: int """ l,r = 0,len(height)-1 maxarea = 0

2021-01-17 18:58:45 83

原创 【leetcode】25 K 个一组翻转链表

题目分析p.next指向翻转子链表的头q指向翻转链表的尾的next把p和q之间的链表翻转得到新的链表L把p.next指向L的头L.next指向qp指向L的尾,然后q向后走k-1步,再次翻转p,q之间的链表python代码class Solution(object): def reverseKGroup(self, head, k): """ :type head: ListNode :type k: int :rty

2020-12-17 23:16:21 98

原创 【leetcode】99 恢复二叉树搜索树

题目分析二叉搜索树的中序遍历就是递增序列,所以我们只要找到被替换树的中序过程中违反递增规律的节点就可以了。替换后 有两种情况:1,[1,3,2,4]2, [4,2,3,1]第一种情况 替换3和2的值。第二种情况 替换4和1的值。在中序遍历树的过程中,只要我们发现逆序数对并且用两个值x,y记录逆序数对的两个值。在第一种情况下 x,y被同时赋值。在第二种情况下,先记录x=4,后记录y=1。最后替换x,y的值,完成恢复。python代码class Solution(object):

2020-12-17 00:19:54 137 1

原创 【leetcode】二叉树中的最大路径和

题目分析求当前节点T包含的最大路径,那么就是 以左节点L开始的最大路径和Lmax,和以右节点开始的最大路径和Rmax,这三个部分构成的最大路径和有(T,T+Lmax,T+Rmax,T+Rmax+Lmax) 这四种情况和当前最大路径和MAX做对比。当求以左节点为开始的最大路径时,左节点必须包含在路径内,并且左节点的左右子树必须选择其中一个或者都不选择,也就是说(L,L+L.Lmax,L+L.Rmax)这三种路径返回最大的给T。python代码class Solution(object):

2020-12-16 22:23:25 103

原创 【leetcode】236 二叉树的最近公共祖先

题目分析因为树中的节点值都是唯一的,所以判断一个点是否是公共祖先有两种方法:1,左右子树都包含一个数,那么这个节点是公共祖先。2,左右子树只有一个包含目标值,当前节点等于另一个目标值。根据这个条件可以筛选出最近的公共祖先。假设这个点不是最近的,那么该节点的父节点也满足这两个条件,则值就不是唯一的,所以这个点就是最近祖先。python代码lass Solution(object): def __init__(self): self.res = None def

2020-12-16 21:57:04 82

原创 【leetcode】437 路径总和III

题目分析每个节点都有可能是路径的开始,所以每次先算以当前节点T为开始的符合条件的路径有几条。然后分别算以左右节点为开始的路径有几条。最后返回T的路径条数+左子树的路径条数+右子树的路径条数。每次算路径和是否等于target时,用sum减去当前节点的数值,如果为0,则当前节点正好是一个路径的尾节点,当前存在1条,如果不为0,那么算左右子树有没有符合sum-当前节点数值的和的路径。python代码class Solution(object): def pathSum(self, root,

2020-12-16 00:03:44 246

原创 【常用算法】AC自动机

背景ac自动机是为了多模式串匹配,它能在O(n)时间范围内完成多个关键词在一个文档中的快速检索。其主要原理是应用了 某个关键词的后缀和另一个关键词的前缀相等,那么没有完成关键词1的匹配时就可以直接跳转到另一个关键词的前缀之后开始匹配。这一跳转主要由字典树中的fail指针完成代码class TrieNode: def __init__(self,val): self.val = val self.fail = None self.child =

2020-12-13 20:26:14 104

原创 【leetcode】98 验证二叉搜索树

题目分析递归,每次为节点设置上下边界。python代码class Solution(object): def isValidBST(self, root): """ :type root: TreeNode :rtype: bool """ return self.helper(root,float("-inf"),float("inf")) def helper(self,root,low

2020-12-12 21:00:57 51

原创 【leetcode】53 最大子序和

题目分析设dp[i]是到i下标的最大子序和。dp[i+1]就根据dp[i]和nums[i+1]算出的值。如果dp[i]小于0,则dp[i+1]等于nums[i+1],否则dp[i+1]等于nums[i+1]。最后的最大值就是dp里的最大值。python代码class Solution(object): def maxSubArray(self, nums): """ :type nums: List[int] :rtype: int

2020-12-12 19:11:19 50

原创 【leetcode】145 二叉树的后序遍历

题目分析后序遍历的顺序是 左->右->根。所以有左节点优先遍历左子树,没有左节点再遍历右子树。每次出栈一个节点,如果这个节点是左子树,那么把右子树入栈。如果是右子树,那么就弹出栈顶根节点,或者结束遍历。python代码class Solution(object): def postorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int]

2020-12-10 23:08:38 72

原创 【leetcode】94 二叉树的中序遍历

题目分析中序遍历是 左->根->右的方式,有左子树就一路向左入栈,每次从栈弹出一个节点t,先把这个节点当做左节点打印出来,然后如果t有右节点就先入栈。python代码class Solution(object): def inorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ stack = []

2020-12-10 00:07:33 81

原创 【leetcode】239 滑动窗口最大值

题目分析维护一个递减的队列,当前数插入时,必须把队尾中小于当前数的数值剔除,再加入当前数到队尾。队头就是最大的值,如果队头的下标已经超出滑动窗口边界,则去掉队头。python代码class Solution(object): def maxSlidingWindow(self, nums, k): """ :type nums: List[int] :type k: int :rtype: List[int]

2020-12-09 23:43:08 75

原创 【leetcode】42 接雨水

题目分析当前的接雨水的数量 等于 min(左边最高的柱子,右边最高的柱子)。python代码class Solution(object): def trap(self, height): """ :type height: List[int] :rtype: int """ if not height: return 0 l =0 r = len(height)-1

2020-12-09 22:57:22 69

原创 【机器学习】auc的计算方法

auc是什么auc是roc的面积,是从一批正负样本中,选择一个正样本,一个负样本,正样本比负样本预测值大的概率。我们使用频率去逼近概率,所以就先对所有样本预测值从大到小排序,并从高到低赋予rank值。抽取正负样本的组合共有 M*N,作为分母。抽取一个正样本,抽取一个比正样本预测值低的负样本,这个组合作为分子。最后的表达式就是python代码# 在 0.8, 0.6,0.5,0.5,0.5,0.5,0.3,0.2# 1 1 0 0 1 0 0 0#pos_

2020-12-09 22:54:32 767

原创 【leetcode】72 编辑距离

题目分析经典的dp题。当word[i]==word[j]时,沿用没有i,j两个字符时的最小编辑距离。当word[i]!=word[j]时,从插入dp[i-1][j]+1,替换dp[i-1][j-1]+1,删除dp[i][j-1]+1中选择一个最小距离。python代码class Solution(object): def minDistance(self, word1, word2): """ :type word1: str :type

2020-12-06 23:11:14 47

原创 【leetcode】214 最短回文串

题目分析看到这道题,一开始想用寻找0开头的最长回文子串的方式做。但是在最后一个case的时候超时了。那么换一种思路来看。在kmp中next数组构成存储在i位置的最长公共前后缀的长度。我们把 acbb 翻转成bbca。acbb的前缀和bbca的后缀的最大公共长度的串是“a”。next[-1]表示当遍历完bbca时的最大公共前后缀的长度L,正式我们需要的值。返回时把acbb L后面的串翻转之后放在前面就可以了。python代码class Solution(object): def s

2020-12-06 22:23:20 105

原创 【leetcode】44通配符匹配

题目分析当s[i-1]==p[j-1]时或者p[j-1]=="?“时,dp[i][j] =dp[i-1][j-1]当p[j-1]==”*“时,(1)如果不使用*号,则dp[i][j] = dp[i][j-1](2)如果使用*号,则dp[i][j]=dp[i-1][j]python代码class Solution(object): def isMatch(self, s, p): """ :type s: str :type p: str

2020-12-05 23:10:58 75

原创 【leetcode】43 字符串相乘

题目分析写竖式乘法,123456先算1236=738,然后1235=6150,最后1456= 45600。然后把738+6150+45600=56088python代码class Solution(object): def multiply(self, num1, num2): """ :type num1: str :type num2: str :rtype: str """ if n

2020-12-04 22:36:30 53

原创 【leetcode】30 串联所有单词的子串

题目分析使用字典+滑动窗口每次选择 words长度的窗口,判断窗口内是否正好包含words所有单词。如果是,记下窗口左指针的位置,否则整体窗口向右移动一位。python代码import copyclass Solution(object): def findSubstring(self, s, words): """ :type s: str :type words: List[str] :rtype: List[int]

2020-12-04 21:38:56 76

原创 【leetcode】32 最长有效括号

题目分析本来打算用dp[i][j]来做,但是发现根本没法实现矩阵内的转移方程。后来看了解法发现只用dp[i]来做就可以。任何一个单独的字符都不构成一对括号,所以初始化值为0。当s[i]=="(“时,dp[i]=0当s[i]==”)“时,如果s[i-1]==”(“时,dp[i] = dp[i-2]+2----------------- 否则如果s[i-dp[i-1]-1]==”(",dp[i] = dp[i-1]+2+dp[i-dp[i-1]-2]最

2020-12-03 23:53:17 88

原创 【leetcode】20.有效的括号

题目分析通过栈来做,当前字符为左括号,则入栈。当前符号为右括号并且栈顶正好是对应的左括号,则出栈。如果不是对应的左括号返回false。最后遍历完字符串,栈不为空,返回false,否则返回truePython代码class Solution(object): def isValid(self, s): """ :type s: str :rtype: bool """ stack = [] fo

2020-12-03 22:32:44 38

原创 【leetcode】14 最长公共前缀

题目分析可以使用归并的思想来做,每两个串left 和right合并出最长公共前缀res,然后res之间再合并。python代码class Solution(object): def longestCommonPrefix(self, strs): """ :type strs: List[str] :rtype: str """ if not strs: return "" return se

2020-12-03 22:24:55 45

原创 【leetcode】5 最长回文子串

题目分析以baacac为例,构造dp[j][i],表示从j到i子串是否为回文序列。因为i==j时是单个字符,一定是回文串,所以dp[j][i]的对角线一定是True。当s[j]!=s[i]时,当前子串s[j:i]一定不是回文串。比如s[0:3]当s[j]==s[i]时,如果s[j:i]长度为2,一定是回文串比如s[1:2]当s[j]==s[i]且子串长度大于2,则依据s[j+1:i-1]判断s[j:i]是不是回文串。比如s[3:5]或者s[2:4]。012345T

2020-12-02 23:49:58 38

原创 【leetcode】3 无重复字符的最长子串

题目分析首先注意到是最长子串 而不是最长子序列。可以使用滑动窗口,i和j分别指向窗口的两端。使用 一个字典去记录窗口内的值。如果当前的字符是已经出现过的,那么左边界必须往右移,移动到刚刚没过当前字符的位置。如果当前字符没有出现过,那么移动右边界把这个字符划分到窗口内。每次窗口变化,和最大窗口长度进行比较,并把最大值赋值给最大窗口长度。python代码class Solution(object): def lengthOfLongestSubstring(self, s):

2020-12-02 22:32:27 55

原创 【leetcode】1143 最长公共子序列

题目分析看到两个字符串就想到用动态规划来做这道题了。设dp[i][j]为text1[:i]和text2[:j]的最长公共子序列的长度。如果计算dp[i][j]分为两种情况:1,当text1[i-1]==text2[j-1]时,此时两个字符串的对应字符相同,所以长度在原来都没这两个字符的基础上+1:dp[i][j]=dp[i-1][j-1]+12, 当text1[i-1]!=text2[j-1]时,此时两个字符串对应的字符不同,那么延续dp[i][j-1]和dp[i-1][j]的最大值。py

2020-11-30 22:42:14 91 2

原创 【leetcode】65 x的平方根

题目分析x的平方根一定小于等于x(如果x等于1 则是等于)。所以可以从1到x的数遍历,这样的话复杂度是O(n)。既然是有序数组的查找,自然可以使用二分法来找数,每次选到的mid值如果mid的平方比x小,说明平方大于等于x的数在mid+1之后,此时让l=mid+1。如果mid的平方大于等于x,说明mid有可能就是第一个平方大于等于x的位置,此时让r=mid。最后当l==r时退出查找,判断r**2==8还是r**2>8来分别输出r或者r-1。题目class Solution(object):

2020-11-30 22:26:06 151

原创 【剑指offer】35 数组中的逆序数对

题目分析方法一(超时):暴力解法。每次找到最小值和其位置,逆序数+=其下标,然后剔除最小值。方法二:归并排序。[87654321],分成两个数组[8765]和[4321]每个数组的内部的逆序数对都是4,并排好序 [5678],[1234].然后合并他们得到[56781234]的逆序数对并排序。最终的逆序数对就是最大的两个区间合并起来算出的逆序数对。python代码# -*- coding:utf-8 -*-class Solution: def __init__(self):

2020-11-29 20:22:16 179

原创 【剑指offer】32 把数组排成最小的数

题目分析冒泡排序。以结果为最小数,排在最前面的数字的选择,应该是每次用第一位的数和后面的数组成两种情况 numbers[0]拼接numbers[j]或者numbers[j]拼接numbers[0],如果前者大,则不变这个位置,后者大则交换0和j的数字。这样遍历一遍后,第一位的数字就是必须排在最前面的。然后再按照这种拼接的方式取出排在第二位的数。依次选出所有位置的数字,返回结果。python代码class Solution: def PrintMinNumber(self, number

2020-11-28 22:53:09 106 2

原创 【剑指offer】29 最小的K个数

题目分析题目的意思很明确。这是典型的topk问题,可以维护一个最小堆,每次从堆的最顶端取数。建堆的过程是一个上浮的过程,每次把新的数放在最后面,依次找K/2父节点的位置,判断父节点和子节点 谁小,子节点小和父节点交换并且继续上浮,否则停止上浮。输出最小值的过程是一个下潜的过程,把根取出,把最后一位补在第一位。然后让根的数值下沉,每次通过k2和k2+1两个位置的子节点值和父节点值对比,如果父节点大则继续下沉,否则停止下沉。整道题就是先建堆,再取出堆的最小值,更新堆的过程。python代码cla

2020-11-28 22:13:52 102 2

原创 【剑指offer】42 和为S的两个数

题目分析左右指针,找到第一个和为S的两个数,返回他俩。python代码class Solution: def FindNumbersWithSum(self, array, tsum): # write code here l = 0 r = len(array)-1 while l < r: s = array[l]+array[r] if s<tsum:

2020-11-28 20:14:19 51

原创 【剑指offer】33 丑数

题目分析每个数乘以2,3,5 就会得到接下来的丑数,但是这个丑数不一定是正好可以排在后面的,所以有个采用不采用的情况。如果p2,p3,p5三个指针某个指针指导的数被采用了,这个指针后移一位。python代码class Solution: def GetUglyNumber_Solution(self, index): # write code here if index ==0: return 0 p2 = p3 = p5 = 0

2020-11-27 22:39:18 88

原创 【剑指offer】37 数字在有序数组中出现的次数

题目分析通过二分法分别找到两个区间第一个大于K的数为 right第一个大于等于K的数为left如果right大于left,返回right-left否则返回0注意右指针的位置一定要等于数组长度,以防发生 所有数都小于等于K的情况python代码class Solution: def GetNumberOfK(self, data, k): # write code here l,r = 0,len(data) while l<r

2020-11-27 22:06:51 60

原创 【剑指offer】27 字符串的全排列

题目分析遍历字符串,把每个字符当做第一个字符,其余的字符继续做全排列,最后去重排序python代码class Solution: def Permutation(self, ss): # write code here if not ss: return [] if len(ss)==1:return [ss] res = set() for i in range(len(ss)):

2020-11-27 21:45:07 46

原创 【剑指offer】48把字符串转换为整数

题目分析首先判断正负数然后从最后一位逐步加到结果上python代码class Solution: def StrToInt(self, s): # write code here if not s: return 0 i = 0 flag = True if s[0]=="-": flag = False i+=1 elif s[0]=="+":

2020-11-27 21:25:15 71

原创 【剑指offer】6 旋转数组中的最小数字

题目分析分为三种情况如果 mid>r,最小值一定在mid右边如果 mid ==r,最小值在 mid和r之间 r= mid -1如果 mid <r,最小值有可能是mid或者mid左边 r = midpython代码class Solution: def minNumberInRotateArray(self, rotateArray): # write code here l = 0 r = len(rotateArray)-

2020-11-26 23:28:10 46

原创 【剑指offer】1 二维数组中的查找

题目分析因为二维数组中每一个坐标为i,j的数,比它大的在下方,比它小的在左边。相当于二分查找中的mid值。所以 从右上角开始和target进行对比。当target比 i,j小的时候向左前进一步当target比i,j大的时候向下前进一步python代码class Solution: # array 二维列表 def Find(self, target, array): # write code here if not array:return Fa

2020-11-26 22:19:12 55

原创 【剑指offer】50 数组中重复的数字

题目分析用set检测是否有重复数字python代码class Solution: # 这里要特别注意~找到任意重复的一个值并赋值到duplication[0] # 函数返回True/False def duplicate(self, numbers, duplication): # write code here s = set() flag = False for n in numbers:

2020-11-25 22:18:15 48

原创 【剑指offer】51 构建乘积数组

题目分析不能使用除法,那么就构建两个数组数组1 larr,第一位是1,其余位的数是A0A1…Ai-1数组2 rarr,最后一位是1,其余位是Ai+1Ai+2*…*An-1最后返回B,B的每一位是larr[i]*rarr[i]python代码class Solution: def multiply(self, A): # write code here larr = [] for i in range(len(A)):

2020-11-25 22:09:59 57

原创 【剑指offer】52 正则表达式匹配

题目分析设p为模式串,s为输入串。当p和s都是空串时,匹配。当p是空串,s不是空串的时候,不匹配当p当前字符不是*的时候–如果p当前字符是.,并且前面的字符都匹配,则当前匹配–如果p当前字符与s当前字符相等,并且前面的字符都匹配,则当前匹配如果p当前字符是时– 如果s当前字符与p去掉两个字符(包括和*前面的字符)时的字符相等,并且前面的字符都匹配,则当前匹配– 如果s当前字符与p去掉前一个字符(也就是*)相等,并且前面的字符都匹配,则当前匹配python代码class Solu

2020-11-24 23:46:20 805

原创 【剑指offer】53 表示数值的字符串

题目分析遍历,分析各种badcase情况,没啥技巧,要有耐心python代码class Solution: # s字符串 def isNumeric(self, s): # write code here hasE = False hasD = False for i, si in enumerate(s): if si == ".": if hasE:

2020-11-23 23:30:49 48

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除