
算法和数据结构刷题
ERCO123
这个作者很懒,什么都没留下…
展开
-
103. 二叉树的锯齿形层序遍历
103. 二叉树的锯齿形层序遍历# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def zigzagLevelOrder(self,原创 2021-03-28 18:47:25 · 88 阅读 · 0 评论 -
【leetcode]523. 连续的子数组和
523. 连续的子数组和class Solution: def checkSubarraySum(self, nums: List[int], k: int) -> bool: if k == 0: return any(nums[i] == 0 and nums[i+1] == 0 for i in range(len(nums) - 1)) mods, cum_sum_mod_k = {0:-1}, 0 for i原创 2021-03-18 22:08:37 · 94 阅读 · 0 评论 -
【leetcode】第229场周赛5685、5686、5687、5688
5685. 交替合并字符串class Solution: def mergeAlternately(self, word1: str, word2: str) -> str: n1, n2 = map(len, (word1, word2)) i, j = 0, 0 res = '' while i < n1 and j < n2: res += word1[i] r原创 2021-02-21 12:41:50 · 161 阅读 · 4 评论 -
【leetcode】字符串算法709、58、771、387、8、14、344、541、151、557、917、242、49、438、125、680、5、10、115
709. 转换成小写字母class Solution: def toLowerCase(self, str: str) -> str: return ''.join(chr(ord(c) + 32) if 'A' <= c <= 'Z' else c for c in str)58. 最后一个单词的长度class Solution: def lengthOfLastWord(self, s: str) -> int: retur原创 2021-02-19 15:37:06 · 194 阅读 · 0 评论 -
【leetcode】高级动态规划
198. 打家劫舍股票买卖问题121. 买卖股票的最佳时机原创 2021-02-18 08:59:58 · 108 阅读 · 1 评论 -
【学习笔记】高级动态规划
复习:原创 2021-02-13 11:08:11 · 208 阅读 · 0 评论 -
【leetcode】排序1122、242、56、493
1122. 数组的相对排序class Solution: def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]: dic = {b:i for i, b in enumerate(arr2)} return sorted(arr1, key = lambda a:dic.get(a, a + 1000))242. 有效的字母异位词**字母异位词:**即为各个字原创 2021-02-12 21:47:01 · 425 阅读 · 0 评论 -
【leetcode】布隆过滤器和LRUCache146
146. LRU 缓存机制原创 2021-02-11 11:07:11 · 321 阅读 · 1 评论 -
【学习笔记】布隆过滤器和LRUCache
布隆过滤器LRUCache原创 2021-02-11 11:04:12 · 122 阅读 · 0 评论 -
【leetcode】位运算191、231.2、190、52
191. 位1的个数class Solution: def hammingWeight(self, n: int) -> int: # 方法1:这个题目华为机试题出现过 # return bin(n).count('1') # 方法二:使用位运算的方法 cnt = 0 while n: n &= n - 1 # 清零最低位的1 cnt += 1原创 2021-02-09 11:26:05 · 181 阅读 · 0 评论 -
【leetcode】高级搜索1091、70、22、51、36、37
1091. 二进制矩阵中的最短路径每一层八个方向,先BFS之后,然后访问的(非0非1的元素)不再被访问视频题解class Solution: def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int: n = len(grid) if grid[0][0] or grid[n-1][n-1]: # 如果(0,0)或(n-1, n-1)为1,按照题解,直接返回 -1原创 2021-02-07 15:40:31 · 195 阅读 · 0 评论 -
【leetcode】并查集200、130
200. 岛屿数量# 这里的方法是并查集class Solution(object): def numIslands(self, grid): if not grid: return 0 row, col = map(len, (grid, grid[0])) id = [i for i in range(row * col)] self.count = sum([grid[i][j] == '1' for原创 2021-02-06 15:29:16 · 119 阅读 · 0 评论 -
2021-01-31
添加链接描述效果如下图所示:意思是在找 d 的parent的时候,不仅找到了a, 并且把沿路上走过的点的parent指向a, 这样下次在找 c, d 的parent的时候直接是O(1)的算法复杂度最后的话是要看下孤立的群里面有几个,就是有几个朋友圈200. 岛屿数量# 这里是采用并查集的方法做的class Solution(object): def numIslands(self, grid): if not grid: return 0 row原创 2021-02-03 09:01:44 · 85 阅读 · 0 评论 -
【leetcode】字典树Trie 208、212
208. 实现 Trie (前缀树)class Trie: def __init__(self): """ Initialize your data structure here. """ self.root = {} self.end_of_word = '#' def insert(self, word: str) -> None: """ Inserts a wo原创 2021-01-30 22:25:48 · 90 阅读 · 1 评论 -
【leetcode】动态规划32、64、91、221、363、403、410、552、621、647、76、312
32. 最长有效括号视频题解class Solution(object): def longestValidParentheses(self, s): dp = [0 for x in range(len(s))] max_to_now = 0 for i in range(1,len(s)): if s[i] == ')': # case 1: ()() i原创 2021-01-28 20:50:16 · 229 阅读 · 2 评论 -
【leetcode】二分算法69、367、33
69. x 的平方根class Solution: def mySqrt(self, x: int) -> int: # return int(x ** 0.5) # 直接用牛顿迭代法 r = x while r * r > x: r = (r + x/r) // 2 return int(r)367. 有效的完全平方数class Solution: def isPer原创 2021-01-23 20:08:35 · 118 阅读 · 0 评论 -
【leetcode】动态规划62、1143、70、120、53、152、322、279、72、55、45、62、63、980
62. 不同路径class Solution: def uniquePaths(self, m: int, n: int) -> int: aux = [[1 for x in range(n)] for x in range(m)] # 他这里是将所有的元素都初始话为1的 for i in range(1, m): for j in range(1, n): aux[i][j]原创 2021-01-22 22:28:52 · 138 阅读 · 1 评论 -
【学习笔记】动态规划
动态规划 = 分治+最优子结构所以动态规划不需要保留所有的状态,只需要保留最优的状态就可以了关键点:动态规划和递归或者分治没有根本上的区别(关键看有无最优的子结构)共性:找到重复的值子问题差异性:最优子结构、中途可以淘汰次优解...原创 2021-01-22 20:09:56 · 85 阅读 · 0 评论 -
【学习笔记】二分查找
二分查找的前提:目标函数单调性(单调递增或者单调递减)存在上下界能够通过索引访问P.S:如果是无序的,只能是所有元素都遍历一遍代码模板left, right = 0, len(array) - 1while left <= right: mid = (left + right) / 2 if array[mid] == target: # 找到目标变量 break or return result elif array[mid] < targ原创 2021-01-17 21:49:29 · 132 阅读 · 0 评论 -
【学习笔记】贪心的实现、特性
这里是贪心的定义和贪心和动态规划的区别:一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。原创 2021-01-17 20:31:42 · 119 阅读 · 0 评论 -
【leetcode】贪心算法322、860、122、455、874、55、45
322. 零钱兑换class Solution: def coinChange(self, coins: List[int], amount: int) -> int: dp = [float('inf')] * (amount + 1) dp[0] = 0 for i in range(1, amount + 1): for j in range(len(coins)):原创 2021-01-17 19:54:17 · 283 阅读 · 5 评论 -
【leetcode】深度优先和广度优先102、433、22、515、127、126、200、529
102. 二叉树的层序遍历def levelOrder(self, root): ans, level = [], [root] while root and level: ans.append([node.val for node in level]) level = [kid for n in level for kid in (n.left, n.right) if kid] return ans433. 最小基因变原创 2021-01-14 21:26:54 · 181 阅读 · 4 评论 -
【leetcode刷题】410、1025、329、392、面试题 08.03
410. 分割数组的最大值class Solution: def splitArray(self, nums: List[int], m: int) -> int: ''' 二分法 时间复杂度:(N log Sum) 空间复杂度:O(1) ''' left , right = max(nums), sum(nums) while left < right:原创 2020-07-25 11:24:26 · 179 阅读 · 0 评论 -
【学习笔记】DFS、BFS代码模板及知识点回顾
深度优先搜索Depth-First-Search搜索-遍历每个节点都要访问一次每个节点仅仅访问一次对于节点的访问顺序不限深度优先:depth first search广度优先 :breadth first searchDFS 代码 - 递归写法visited = set()def dfs(node, visited): if node in visited: # terminator # already visited return visited.add(node)原创 2020-07-12 23:17:35 · 283 阅读 · 0 评论 -
【leetcode】分治、回溯练习题目 50、78、169 、17、51
50 Pow(x, n) (Facebook 在半年内面试常考)思路Base Case: n == 0Function: F(x ^ n) = F(x ^ (n // 2)) * F(x ^ (n // 2))不论我们返回时候如何,我们执行第一步,先设立Base Case:if n == 0: return 1完了以后,我们要对大问题进行拆分,也就是不断的对b的值折半拆分:half = self.myPow(x, n // 2)当拆分到了最小的问题,满足base case n ==原创 2020-07-12 17:10:27 · 233 阅读 · 0 评论 -
【leetcode】泛型递归、树递归练习题 70、22、226、98、104 、 111、297、236、105、77、46、47
70. 爬楼梯(阿里巴巴、腾讯、字节跳动在半年内面试常考)# 方法一:数学法class Solution: def climbStairs(self, n: int) -> int: sqrt5 = sqrt(5) fib = pow((1 + sqrt5)/2, n + 1) - pow((1 - sqrt5)/2,n + 1) return int(fib / sqrt5)# 方法二:加了缓存的递归class Solution:原创 2020-07-08 19:41:44 · 301 阅读 · 0 评论 -
【leetcode】哈希、树、二叉树、堆、二叉堆入门级练习题242 49 1 94 144 590 589 429 剑指offer40 239 剑指offer49 347
242.有效的字母异位词(亚马逊、Facebook、谷歌在半年内面试中考过)class Solution: def isAnagram(self, s: str, t: str) -> bool: return collections.Counter(s) == collections.Counter(t)49.字母异位词分组(亚马逊在半年内面试中常考)class Solution: def groupAnagrams(self, strs: List[str]原创 2020-07-01 15:09:47 · 241 阅读 · 0 评论 -
【学习笔记】图的实现和特征
1.图的属性和分类本部分图的内容,面试的时候应该根据被面试公司的情况看是否需要准备更多内容,文末有相关学习链接图的属性Graph(V, E):图是点和边的集合构成的V -vertex:点度:入度和出度点与点之间:连通与否E - edge:边有向和无向(单行线)权重(边长)图的表示和分类图的表示方法有两种,分别是:邻接矩阵:有相邻的边加权重,没有的话如果有边加1,没有边的化加 0如果是有向图的话,其邻接矩阵是对称矩阵邻接表:用链表来存储和点相连原创 2020-07-01 10:02:10 · 317 阅读 · 0 评论 -
【学习笔记】堆Heap和 二叉堆 Binary Heap
1.堆 Heap定义:可以迅速找到一堆数中的最大值或者最小值的数据结构。应用场景:经常是一个数一个数的过来,比如找最大值或者找最小值分类:堆本身是一个抽象的数据结构,根据实现形式,将其分为二叉堆、斐波那契堆等。P.S: 二叉堆是堆(优先队列 priority_queue) 的一种常见且简单的实现,但是并不是最优的实现形式,但是在面试的时候以及教科书上出现比较多。真正在工程中使用的是 严格斐波那契堆等性能优异的堆,面试的时候知道有这么一种堆就行,暂时没必要知道怎么实现的。参考将根节点最大的堆叫做原创 2020-06-30 10:18:09 · 286 阅读 · 0 评论 -
【leetcode】树、二叉树、二叉搜索树 实战题目94 144 590 589
94. 二叉树的中序遍历(亚马逊、微软、字节跳动在半年内面试中考过)为什么有人说写的递归程序效率不高,这个不是递归的原因,是因为自己的逻辑问题,比如斐波那契数列那道题就是因为递归没有加缓存保留之前的状态,导致写出来的递归程序效率很低,在写树的相关程序的时候我们要“爱上递归,拥抱递归‘# 方法一:recursivelyclass Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: res =原创 2020-06-29 22:54:45 · 165 阅读 · 0 评论 -
【leetcode】 数组和链表练习题目 26 189 88 21
26. 删除排序数组中的重复项 class Solution: def removeDuplicates(self,nums:List[int])->int: # 双指针 i = 0 for j in range(len(nums)): if nums[i] != nums[j]: i += 1 nums[i] = nums[j] ret.原创 2020-06-29 10:14:19 · 8608 阅读 · 0 评论 -
【leetcode】贪心算法1338 455
Online Judge 与算法的特点牛客网的是标准的输入输出,leetcode 是写的函数,面试之前要两者都进行训练贪心的题目尝试证明------->可以用贪心找反证--------->证明不可以用贪心如果没有别的做法,就相信他是贪心,接下来就多加练习题面破解:题面出现 ’最‘ 或者等价的字可能是贪心贪心的题目一定有 ’ 最‘ 字贪心往往伴随着排序(因为排序就潜在的定义了 贪心提到的 ’ 好‘ )1338 数组大小减半class Solution: .原创 2020-06-29 10:12:14 · 236 阅读 · 0 评论 -
【LeetCode】哈希表、字典、集合 实战题目 242 49 1
242 有效的字母异位词(亚马逊、Facebook、谷歌在半年内面试中考过)注意切题四件套:clarification 和面试官搞清楚题目的要求,即题面是什么,比如在本题中需要搞清楚,什么是异位词:异位词是字母出现的次数一样,但是出现顺序不一样的词在本题中是否区分大小写?possible solutions—>optimal(time & space)codetest cases这里一定要记得和面试官要几个测试样例,证明你做事是有始有终的本题的方法有:暴力法:原创 2020-06-28 21:50:40 · 5924 阅读 · 0 评论 -
【leetcode】栈、队列、双端队列、优先队列实战题目20 155 84 239 641 42
P.S:见到最近相关性的问题,想到用栈见到有先后顺序的时候,或者先来后到的时候用到 queue20 有效括号凡是涉及到最近相关性的可以考虑到用栈解决class Solution: def isValid(self, s: str) -> bool: hashmap = {']':'[','}':'{',')':'('} stack = [] for char in s: if char in hashmap:原创 2020-06-26 22:13:26 · 232 阅读 · 0 评论 -
【学习笔记】常见数据结构及在其上的时间复杂度和空间复杂度 & 对应语言的API 文档快速查询
学习过数据结构和算法的人一定不会对下面的几张图陌生了,这几张图展示的比较全,希望可以供自己备查,也可以帮助到更多的人目录1.常见的时间复杂度、空间复杂度的类型2.常见数据结构和算法的时间和空间复杂度3.常见的排序算法时间和空间复杂度API 官方文档及源码的快速查询1.常见的时间复杂度、空间复杂度的类型2.常见数据结构和算法的时间和空间复杂度3.常见的排序算法时间和空间复杂度API 官方文档及源码的快速查询比如想查 在 python 里面 stack 的API,在Goole 或者百度上面输入原创 2020-06-25 15:15:23 · 139 阅读 · 0 评论 -
【学习笔记】栈、队列、双端队列、优先队列
目录1. stack 栈2. Queue 队列3. Deque 双端队列4.Priority Queue 优先队列1. stack 栈先进后出(FILO),或者叫后进先出(LIIFO)操作复杂度添加O(1)删除O(1)查询O(n)P.S: 因为元素是无序的,所以查询的时间复杂度是 O(n)的2. Queue 队列先进先出(FIFO) , 后进后出(LILO)操作复杂度添加O(1)删除O(1)查询O(n)3原创 2020-06-25 15:01:01 · 202 阅读 · 0 评论 -
【LeetCode】Linked List 实战题目 206 24 141 142 25
P.S: 链表类的题目比较简单,但是如果一不小心容易写的特别复杂,需要在面试之前把复杂的链表题目再熟悉一下206 反转链表(字节跳动、亚马逊在半年内面试常考)本题参考题解# 迭代法def reverseList(head): # 申请两个节点 pre 和 cur ,pre 指向 None pre, cur = None, head while cur: cur.next = pre # 然后将当前的节点指向 pre pre = cur原创 2020-06-25 01:06:50 · 387 阅读 · 0 评论 -
【LeetCode】Array 实战题目 1 11 283 70 15
1两数之和(近半年内,字节跳动在面试中考查此题达到 152 次)11盛最多水的容器(腾讯、百度、字节跳动在近半年内面试常考)移动零(华为、字节跳动在近半年内面试常考)爬楼梯(阿里巴巴、腾讯、字节跳动在半年内面试常考)数学法的证明如下:三数之和(国内、国际大厂历年面试高频老题)...原创 2020-06-24 17:44:30 · 259 阅读 · 0 评论 -
【leetcode】125 509 70 23 407
原创 2020-06-19 23:06:06 · 166 阅读 · 0 评论 -
【leetcode】53 4
原创 2020-06-19 00:15:57 · 114 阅读 · 0 评论