自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 入职第二周,上了三天班又放假啦 回溯套路

回溯算法的模板:不合适就退回上一步result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表) 撤销选择子集问题:要用 start 参数排除已选择的数字组合问题利用的是回溯思想,结果可以表示成树结构,我们只要套用回溯算法模板即可,关键点在于要用一个

2020-06-28 00:12:46 278

原创 力扣入职第一周,啥也不是呜呜呜呜

297. 二叉树的序列化与反序列化前序遍历# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Codec: def serialize(self, root): """Encod

2020-06-21 22:58:52 295

原创 6.12 要收拾东西了!这两天无心做题,希望去实习一切顺利!

1217. 玩筹码不改变筹码位置的奇偶性时代价为0改变奇偶性的代价为1class Solution: def minCostToMoveChips(self, chips: List[int]) -> int: a,b=0,0 for i in chips: if i&1: a+=1 else: b+=1 return

2020-06-12 23:18:05 343

原创 6.11 力扣 一开始不想做题效率就下来了 回溯法(全排列问题)

365. 水壶问题数学方法:每次操作只会让桶里的水总量增加 x,增加 y,减少 x,或者减少 y,两个桶不可能同时有水且不满。操作的结果都至少有一个桶是空的或者满的;我们可以认为每次操作只会给水的总量带来 x 或者 y 的变化量。两个壶中水的总量一定为:ax+by,a,b是整数,因此我们的目标可以改写成:找到一对整数 a,b,使得 ax+by==z,且z<=x+y贝祖定理:若x,y是整数,且gcd(x,y)=d,那么对于任意的整数a,b,ax+by都一定是d的倍数,特别地,一定存在整数a,b

2020-06-11 23:23:30 304

原创 6.10力扣 10号出去逛街了,11号补上! 打印n位数

154 153557. 反转字符串中的单词 IIIclass Solution: def reverseWords(self, s: str) -> str: arr=s.split(' ') res=[] for i in arr: res.append(i[::-1]) return ' '.join(res)345. 反转字符串中的元音字母class Solution: def

2020-06-11 15:32:05 141

原创 6.9 力扣 相似度为K的字符串(写不出来,BFS) 拓扑排序

326. 3的幂math.log(m,n)n为底数,m为真数(即幂)class Solution: def isPowerOfThree(self, n: int) -> bool: if n<=0: return False ans=math.log(n,3) if n==3**round(ans): return True return False342 4的幂

2020-06-09 15:37:56 289

原创 6.8 力扣 二分法

509. 斐波那契数时间复杂度O(N)空间复杂度O(1)class Solution: def fib(self, N: int) -> int: a,b=0,1 count=2 while count<=N: a,b=b,a+b count+=1 return b if N>=2 else N873. 最长的斐波那契子序列的长度递增数组,以两个数作为数

2020-06-08 22:30:48 197

原创 6.7力扣 最长公共子序列变种 贪心算法 窝工生日快乐!

712. 两个字符串的最小ASCII删除和法一:动态规划求得是删除的字符值最小的结果dp[i][j]表示s1以i结尾,s2以j为结尾的字符串之间使ascii值相等,需要删除字符和的最小值如果s1[i]==s2[j],那么dp[i][j]=dp[i-1][j-1],当前元素相等,不需要删除如果不相等,则删除其中一个字符串的最后一个元素,到底删除哪一个就看是哪一个字符加到分别对应的上一个dp上能使当前dp最小需要将边界初始化,边界是其中一个字符串为空,dp值为另一个字符串的ascii值的累加和dp

2020-06-07 15:21:19 652

原创 6.6 吉利的一天! 最长上升子序列(三种方法)

1337. 方阵中战斗力最弱的 K 行class Solution: def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]: #每一行最左边的0 def binary(num): left,right=0,len(num)-1 while left<right: mid=left+(right-lef

2020-06-06 18:40:35 402

原创 6.5 力扣 今天是发愁开题的一天

1331. 数组序号转换class Solution: def arrayRankTransform(self, arr: List[int]) -> List[int]: ans=sorted(list(set(arr))) hashmap={} for i,value in enumerate(ans): hashmap[value]=i+1 return [ hashmap[j] for j i

2020-06-05 21:01:58 153

原创 6.4 力扣 买卖股票六道动态规划(三维,穷举状态 好难,多看题解)

243 最短单词距离class Solution(object): def shortestDistance(self, words, word1, word2): """ :type words: List[str] :type word1: str :type word2: str :rtype: int """ res = len(words) - 1 pos1,

2020-06-04 19:16:49 521

原创 6.3 力扣 栈

1003. 检查替换后的词是否有效就是一直消除 abc 的字符串。依次遍历S中的每个字符,如果当前字符为c,判断栈顶两个字符是不是b和a,如果是,两次退栈, 否则可直接判断S不是有效的字符串, 当前前提是先判断栈中元素个数是不是大于2,如果不是,直接判断无效。如果是 字符a 和b直接入栈。class Solution: def isValid(self, S: str) -> bool: stack=[] for c in S:

2020-06-03 20:40:44 207

原创 6.2 力扣 括号题几乎都和栈有关

1370. 上升下降字符串桶排序,将26个字母作为26个桶,统计每个字母出现次数class Solution: def sortString(self, s: str) -> str: h=[0]*26 for i in s: h[ord(i)-97]+=1 res=[] n=len(s) while True: if len(res)==n:

2020-06-02 20:16:08 356

原创 6.1力扣栈 期待offer的儿童节礼物!

56. 合并区间class Solution: def merge(self, intervals: List[List[int]]) -> List[List[int]]: if not intervals: return intervals intervals=sorted(intervals,key=lambda x:(x[0],x[1])) res=[] res.append(intervals

2020-06-01 00:40:34 190

原创 5.31 力扣 栈

面试题09. 用两个栈实现队列class CQueue:#栈先进后出,队列先进先出 def __init__(self): self.stack1=[] self.stack2=[] def appendTail(self, value: int) -> None: while self.stack2: self.stack1.append(self.stack2.pop()) self.s

2020-05-31 20:04:49 258

原创 5.30 力扣 二分查找 几何题

278. 第一个错误的版本# The isBadVersion API is already defined for you.# @param version, an integer# @return a bool# def isBadVersion(version):class Solution: def firstBadVersion(self, n): """ :type n: int :rtype: int """

2020-05-30 00:15:50 277

原创 5.29力扣 二分查找

395. 至少有K个重复字符的最长子串滑动窗口:每次都要重新遍历整个字符串class Solution: def longestSubstring(self, s: str, k: int) -> int: max_num=len(set(s)) res=0 for i in range(1,max_num+1): #当不同字符个数为i时,最长字符串的长度 res=max(res,self.

2020-05-29 00:52:42 284

原创 5.28 力扣 字符匹配解码

1171 从链表中删去总和值为零的连续节点前缀和 用字典 前缀和存指针两个结点的前缀和相等,说明两个结点之间和为0、如果后面前缀和等于前面的前缀和,则用后面的结点覆盖前面的结点然后重构结点申请当前节点的前缀和sum为key,当前节点指针为value的哈希表class Solution: def removeZeroSumSublists(self, head: ListNode) -> ListNode: seen=dict() dummy=Li

2020-05-28 00:47:18 302

原创 5.27 力扣链表

581. 最短无序连续子数组排序后比较两个数组最左边和最右边不一致的元素超时class Solution: def findUnsortedSubarray(self, nums: List[int]) -> int: l,r=len(nums),0 for i in range(len(nums)-1): for j in range(i,len(nums)): if nums[i]>num

2020-05-27 23:29:43 327

原创 5.26力扣 字符串处理 双指针

146. LRU缓存机制我们用一个哈希表和一个双向链表维护所有在缓存中的键值对我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1) 的时间内完成 get 或者 put 操作。在双向链表的实现中,使用一个伪头部(dummy head)和伪尾部(dummy tail)标记界限,这样在添加节点和删除节点的时候就不需要检查相邻的节点是否存在。每次添加新节点都将节点添加到头部,每次删除节点都删除尾部节点#定义双向链表class listnode:

2020-05-26 00:48:45 274

原创 5.25 力扣 排序(冒泡、快速、桶) 二分

排序冒泡排序:依次比较相邻元素,进行len-1次冒泡,第K次冒泡将倒数第k个元素排好序for i in range(len(s)): for j in range(len(s)-i): if s[j]>s[j+1]: s[j],s[j+1]=s[j+1],s[j]快速排序: 递归加分治 215不稳定排序,中间交换过程会打乱顺序时间复杂度:最差O(N^ 2),平均O(N^logN)取中间值作为基准,数列从第一个值开始比较,小于基准值放入左边分区,大于基准值放入右边分区然后依次

2020-05-25 11:15:56 846

原创 5.24 力扣 位运算

回文串,最长公共子串线段树前缀和 状态压缩加哈希表1124904 930 992位运算:https://muyids.github.io/simple-algorithm/chapter/%E4%BD%8D%E8%BF%90%E7%AE%97.html子数组和https://segmentfault.com/a/1190000019748859

2020-05-24 15:23:28 436

原创 5.23力扣 最大子数组和 前缀和+单调栈

面试题 16.16. 部分排序当一个数a[i]左侧有一个数比它大的时候,或者右侧有一个数比它小的时候,它一定是在被排序的序列内。因为一个数如果 左边的数都比它小,右边的数都比它大,显然没必要排序。那么对于元素 a[i] 来说,如果它左边存在大于 a[i] 的元素,那么 a[i] 是一定要参与到排序里去的。或者说如果它右边存在小于 a[i] 的元素,那么 a[i] 也是要参与到排序里去的。所以我们只需要寻找最靠右的那个数(满足左边存在大于它的数),和最靠左的那个数(满足右边存在小于它的数),那么这两

2020-05-23 22:04:38 556

原创 5.22 力扣 滑动窗口 前缀和应用 单调栈(768)

1248. 统计「优美子数组」法一:滑动窗口例如 nums=[1,2,1,1,2,2,1,2,1],k=2stack=[0,1,3,4,7,9],0和9是增加的边界当i=1,符合条件的最小数组是第一个1和第三个1之间,即 nums[0]-nums[2],则左边界的可能的点是stack[1]-stack[0],右边界可能的点是stack[i+k]-stack[i+k-1]即(stack[3]-stack[2])class Solution: def numberOfSubarrays(s

2020-05-22 00:13:59 370

原创 力扣 5.21 单调栈

414. 第三大的数排序的时间复杂度是O(nlogn)优先队列(复杂度O(nlg3))时间复杂度为O(n),因此需要一次遍历,用三个数保存数组的前三大数字空间复杂度为O(1)class Solution: def thirdMax(self, nums: List[int]) -> int: a=b=c=float('-inf') for i in nums: if i>a: c=b .

2020-05-21 16:11:04 493 1

原创 5.20 优先队列(堆 每个元素插入堆删除的 时间复杂度都是O(logk),k是堆的长度) 链表 DFA(自动机)

优先队列和堆: 堆特别适合找第k大、K小的特殊数据结构翻转链表:203 445 92需要两个指针,前指针和当前指针nxt=cur.nextcur.next=prepre=curcur=nxt优先队列和堆: 堆特别适合找第k大、K小的特殊数据结构...

2020-05-20 16:43:33 2632

原创 5.19 力扣 拓扑排序 滑动窗口(1040,30) 矩阵前缀和

拓扑排序:针对有向无环图210. 课程表 II拓扑排序:有向无环图,依次访问每个节点,且节点只出现一次拓扑序列可以保证每个活动开始时,前一项活动已经完成对每个节点标记为 已经访问过,正在访问,还未访问课程学习应该是有向无环图,否则有些活动将无法进行class Solution: def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]: course=

2020-05-19 23:41:44 667

原创 5.18 优先队列(堆) 滑动窗口(二) 交换链表的节点

295. 数据流的中位数最简单的思路暴力法,每次读入数据都进行排序但是中位数只对中间的一个或两个数据感兴趣,其他数没有必要进行交换或者比较https://leetcode-cn.com/problems/find-median-from-data-stream/solution/you-xian-dui-lie-python-dai-ma-java-dai-ma-by-liwe/只需要关注这两个数组的 最值堆具有这样的性质,每次从堆里取出一个‘最值’数据,不用管别的元素前有序数组 作为大.

2020-05-19 20:03:43 324

原创 5.17 位运算 滑动窗口(一) 删除二叉搜索树中节点(重要 450)

https://blog.youkuaiyun.com/qq_43152052/article/details/102840715

2020-05-17 17:32:09 267

原创 5.16力扣 并查集 DFS滑动窗口

1202 交换字符串中给定元素初始化:一开始根节点就是本身索引依据pair将2个编号连接,只需把这2个编号的联通分量设置成一样就行了。find方法用于找到某个编号的联通分量,union方法将两个编号的联通分量修改为一样的把联通分量作为字典key给字符串的索引分组,因为同一组内的索引都是可以互相交换的的在每一组内,按照索引还原成字符在组内排序,排序完成后根据原所在数组位置放回去每一个连通分量中的各个索引位都可以互相交换 所以只要对各个连通分量中的字符进行排序再写回就可以了class Soluti

2020-05-16 01:53:59 261

原创 5.15力扣 并查集 位运算 前缀和 带权的图(399)

547 朋友圈class union: def __init__(self,n): self.pre=[i for i in range(n)] self.rank=[1 for i in range(n)] self.cnt=n def find(self,x): #注意这里是while,不是if while x !=self.pre[x]: x=self.pre[x]

2020-05-15 16:56:31 212

原创 5.14 力扣 利用数组索引判断元素是否存在 并查集DSU

442. 数组中重复的数据法一:通过索引号排序,比如数字4放到索引3的位置,最后找排序后数组,与索引号没有相差1便是重复元素,从前到后依次将数据放到合适的索引nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1] 和 nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]不一样class Solution: def findDuplicates(self, nums: List[int]) -

2020-05-14 18:39:47 393

原创 力扣 5.13 二分法计算完全二叉树有多少节点 双指针法删除元素

面试题 04.03. 特定深度节点链表# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = None# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x#

2020-05-13 15:44:13 234

原创 5.8 力扣 堆 合并K个链表 迭代后序遍历

文章目录942.增减字符串匹配我们维护当前未使用的最小和最大的数,它们对应的区间为当前未使用的数的集合。从左向右扫描字符串,如果碰到 ‘I’,就取出当前最小的数,否则取出当前最大的数。class Solution: def diStringMatch(self, S: str) -> List[int]: n=len(S) l,h=0,n ...

2020-05-11 20:22:12 214

原创 5.9 力扣 监控二叉树(从下往上标记状态) 分配硬币 图的DFS 二叉搜索树困难

AVL树排序最长子序列,最长字符串968 监控二叉树最小支配集问题叶子结点位于树的边界,不会安装摄像头有孩子结点是叶结点的结点必须安摄像头# 图论里面的最小支配集问题,只有在二叉树这种特殊的图下 才能够求解,两种方法(贪心or动态规划)class Solution(object): def minCameraCover(self, root): def solve(node): if not node:

2020-05-11 20:21:16 604

原创 5.11力扣 回溯 负进制转换 669修剪二叉搜索树 二叉树最长交错路径 最近公共祖先 判断是都是BST(迭代好想,递归不好想) 卡特兰数

AVL树排序最长子序列,最长字符串欧拉路径奇怪的打印机684. 冗余连接二叉树中使用全局变量:129 1372 1373二叉树的直径1261 在受污染的二叉树中查找元素层次遍历修改数据,用集合保存数据# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass FindElemen

2020-05-11 20:19:48 213

原创 python 二叉树的前中后序遍历 N叉树的遍历

递归方法都简单 用迭代法写主要利用了栈先进后出的原理,以及一层一层访问数据,操作数据入栈中序遍历: 先到达左叶子结点(一路向左),然后依次推出栈顶数据,如果该节点存在右子树,则储存完根节点数据后,转向该节点右子树,若不存在右子树且栈不为空,则出栈下一个数据,即左-根-右-左-根-右前序遍历:从根节点开始,先存储根节点的值,然后依次压入根节点的右孩子、左孩子,并弹出栈顶数据,则弹出顺序为左孩子、右孩子,符合前序遍历 根-左-右的顺序后序遍历:两种方法:一:按照前序遍历,但是依次压入根节点的左

2020-05-11 20:10:14 559

原创 5.10 力扣 二叉搜索树 专题 671在议(没有利用节点值小于等于子节点的条件) 450 删除二叉搜索树中结点(利用前序,后继)

AVL树排序最长子序列,最长字符串欧拉路径奇怪的打印机173 二叉搜索树迭代器:迭代器是使程序员能够遍历容器的对象。hasNext():若栈中还有元素,则返回 true,反之返回 false。所以这是一个 O(1)的操作不符合题目要求:# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left

2020-05-10 21:10:32 361

原创 链表 Python

class Node: def __init__(self,x): self.data=x self.next=None def getadta(self): return self.dataclass solution: def __init__(self): self.head=None ...

2020-04-08 01:17:43 197

转载 0-1背包问题,Python

转自:https://www.kancloud.cn/kancloud/pack/70130背包问题九讲01背包问题:每件物品只有一件有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。每件物品可以选择放或者不放时间和空间复杂度均为O(VN)f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值状态转移...

2020-04-07 22:14:24 517

空空如也

空空如也

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

TA关注的人

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