
python算法题
文章平均质量分 63
Leetcode或者nowcoder里面的题目,总结做题思路,解题经验。
卢容和
这个作者很懒,什么都没留下…
展开
-
剑指43 1-n中1出现的次数、44 数字序列中某一位的数字(数学规律,难)
剑指 Offer 43. 1~n 整数中 1 出现的次数(困难)官方题解:固定蓝色字,绿色和红色部分就按顺序变化,变化范围就是把蓝色字忽略,剩下的组成数字。在这里插入代码片原创 2021-10-22 16:03:01 · 162 阅读 · 0 评论 -
剑指 Offer 60 n个骰子的点数 49 丑数 51数组中的逆序对
剑指 Offer 49. 丑数(动态规划)到这里可以独立完成了。class Solution: def nthUglyNumber(self, n: int) -> int: a, b, c = 0, 0, 0 #dp的索引 dp = [1] * n for i in range(1, n): while dp[a] * 2 <= dp[i-1]: a += 1 # 需要等于号 wh原创 2021-10-21 19:18:38 · 83 阅读 · 0 评论 -
剑指 Offer 37 序列化二叉树、字符串的全排列、正则表达式匹配(难)
剑指 Offer 37. 序列化二叉树你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。这个不难,只是把空节点也放入队列。反序列化,可根据计算公式,如果他是完全二叉树,索引从1开始,我们是知道父节点索引为x,则左儿子是2x,右儿子为2x+1。这里索引从0开始。公式就有一点不同。父亲索引x,左儿子2x+1,右儿子2x+2上图公式就是说,父亲之前有多少个空节点,它原创 2021-10-20 23:45:24 · 213 阅读 · 0 评论 -
剑指 Offer 59 队列的最大值、滑动窗口的最大值
剑指 Offer 59 - I. 滑动窗口的最大值(困难)给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。剑指Offer 30. 包含 min 函数的栈 ,其使用 单调栈 实现了随意入栈、出栈情况下的 O(1) 时间获取 “栈内最小值” 。本题同理,不同点在于 “出栈操作” 删除的是 “列表尾部元素” ,而 “窗口滑动” 删除的是 “列表首部元素” 。双向队列到这应该可以动手实现了。只要加入的值比现有的都大,窗口往右移,该窗口的最大值就不受该值前面的元素影响,所以可原创 2021-10-20 16:07:26 · 81 阅读 · 0 评论 -
表示数值的字符串、字符串转换成整数
剑指 Offer 20. 表示数值的字符串估计出现概率不大的一题,直接看题解,学习什么是有限状态自动机。(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数不能只有小数点,小数点后面可以没有数字执行 t = ‘?’ ,代表为不属于判断范围的非法字符,后续直接返回 falsefalse 。若字符类型 tt 不在哈希表 states[p]states[p] 中,说明无法转移至下一状态,因此直接返回 FalseFalse 。首先你得心思紧密画出这个状态转移图,每个状态代表什么含义。又一次cv工原创 2021-10-20 10:57:55 · 110 阅读 · 0 评论 -
打印矩阵、栈的压入弹出序列
剑指 Offer 29. 顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。这题按着顺时针循环就可以,需注意索引是否越界,是否转弯处多读或少读。class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: if not matrix: return [] # 不是None i, j, row, col =0, 0, len(matrix)-原创 2021-10-20 00:09:13 · 111 阅读 · 0 评论 -
数学题-Offer 39超过一半的数字、66构建乘积数组、14剪绳子i ii、57、62最后剩下的数字
剑指 Offer 39. 数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。以前做过,这个数没遇到不同它的计数减一,遇到自己加一,如果计数等于0,说明该换另外一个数了。出现的次数超过数组长度的一半的数,最后肯定是它生存下来。class Solution: def majorityElement(self, nums: List[int]) -> int: count = 0 cur = None f原创 2021-10-17 17:27:06 · 101 阅读 · 0 评论 -
位运算-数组中数字出现的次数
剑指 Offer 56 - I. 数组中数字出现的次数一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。相同数字的异或为0,空间复杂度限制不能用字典存储。只能想到这,看官方题解本题难点: 数组 nums 有 两个 只出现一次的数字,因此无法通过异或直接得到这两个数字。步骤:遍历 nums执行异或:循环左移计算 m:如何判断? 直接用00001作为尺度,然后左移00010,…拆分 nums为原创 2021-10-13 12:10:45 · 128 阅读 · 1 评论 -
位运算-加法机制、转为二进制
剑指 Offer 15. 二进制中1的个数方法一:逐位判断class Solution: def hammingWeight(self, n: int) -> int: res = 0 while n: res += n & 1 n >>= 1 # n //= 2 # 计算时间长 return res方法二:巧用 n & (n - 1)原创 2021-10-12 13:38:11 · 183 阅读 · 0 评论 -
分治算法—重建二叉树、数值的整数次方、二叉搜索树后序遍历
剑指 Offer 07. 重建二叉树这本来是笔试题常考,代码也要会才行。因为笔试你会一步步求左子树右子树,代码里就等于用递归去实现。之前浏览过一篇详细介绍如何通过两种遍历构建二叉树。最终还是参考了上面的文章,用一个函数就解决# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None#原创 2021-10-12 11:19:27 · 169 阅读 · 0 评论 -
回溯-二叉树的最近公共祖先,从上往下判断or记录路径
剑指 Offer 64. 求1+2+…+n求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。碰到这种,由于头脑不好使,直接看题解。函数需要的功能:实现 “当 n = 1n=1 时终止递归” 的需求,可通过短路效应实现。class Solution: def __init__(self): self.res = 0 def sumNums(self, n: int) ->原创 2021-10-10 23:02:58 · 136 阅读 · 0 评论 -
回溯-二叉树的深度、判断平衡二叉树
剑指 Offer 55 - I. 二叉树的深度# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def maxDepth(self, root: TreeNode) -> int:原创 2021-10-10 16:14:19 · 114 阅读 · 0 评论 -
排序-最小k个数、数据流的中位数、堆模块、双堆
剑指 Offer 40. 最小的k个数刚好上一篇讲到小顶堆和快排两种排序,都可以解决第k个问题。官方的快排使用ij交换下面是我的错误想法找出第k小,首先要会写快排。一轮快排,左边(乱序)小于基准数,右边(乱序)大于基准数:如果基准数为第K个,完事。基准数<K,要到右边寻找,此时寻找第K减去基准数个。基准数>K,要到左边寻找,此时寻找还是第K个。…遇到问题:K是从1开始,基准数从0开始错在要到右边寻找,此时寻找第K减去基准数个,因为递归的时候,下标是不变的。可能有些题目原创 2021-10-10 13:29:29 · 110 阅读 · 0 评论 -
排序-把数组排成最小的数,堆,快速排序,内置sort
硬知识sort函数结合functools.cmp_to_key(func)sorted函数详解(高级篇)小顶堆内置heapq模块堆heapq模块快速排序在选择大于标准和小于标准方面,有两个方法ij交换ij轮流赋值和代码剑指 Offer 45. 把数组排成最小的数这题学到如何改变比较函数、快速排序写法快速排序一定要想清楚,为什么最后将第一个元素赋给low是成立的输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。给你来个元素x和y,怎么知道谁在原创 2021-10-10 01:46:24 · 174 阅读 · 0 评论 -
树的搜索-二叉树中和为某一值的路径、二叉搜索树与双向链表、右根左遍历
剑指 Offer 34. 二叉树中和为某一值的路径给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。要记录路径的值找到路径之后不需要return又遇到python 巨坑:排除这个问题,总算成功# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):#原创 2021-10-09 22:31:15 · 188 阅读 · 0 评论 -
搜索与回溯-剑指:矩阵中的路径、机器人的运动范围
剑指 Offer 12. 矩阵中的路径了解到整个算法流程,需要动手去尝试,看看递归的入口,减枝的位置,整个回溯函数的结构。一次通过,虽然也不确定自己逻辑是否正确,所以需要自己去尝试class Solution: def exist(self, board: List[List[str]], word: str) -> bool: def contains(x, y, key): if key == self.length: return Tr原创 2021-10-09 17:01:27 · 105 阅读 · 0 评论 -
双指针-两个链表的第一个公共节点、环形链表 II、和为s的两个数字、翻转单词顺序
剑指 Offer 18. 删除链表的节点给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。题目保证链表中节点的值互不相同。pre、node分别指前一个节点、要判断的节点class Solution: def deleteNode(self, head: ListNode, val: int) -> ListNode: if head.val == val: return head.next pre, node原创 2021-10-09 01:04:38 · 190 阅读 · 0 评论 -
动态规划-最长不含重复字符的子字符串
剑指 Offer 46. 把数字翻译成字符串给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"class Solution: def translateNum(self原创 2021-10-08 20:27:17 · 148 阅读 · 0 评论 -
动态规划-礼物的最大价值
剑指 Offer 42. 连续子数组的最大和输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。python:整数的最大值和最小值class Solution: def maxSubArray(self, nums: List[int]) -> int: count = 0 best = -sys.maxsize for x in nums: count += x原创 2021-10-01 22:16:01 · 148 阅读 · 0 评论 -
动态规划—剑指10、63
剑指 Offer 10- I. 斐波那契数列class Solution: def fib(self, n: int) -> int: a = [0,1] for _ in range(n-1): nexts = a[-1] + a[-2] a.append(nexts) return a[n] % 1000000007class Solution: #a代表当前,b代表下一个 def原创 2021-10-01 18:20:54 · 76 阅读 · 0 评论 -
搜索与回溯算法——树的遍历(难)
剑指 Offer 26. 树的子结构太久没碰过树结构,不会深度遍历了。输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)参考答案:通常不知道如何入手的题目,可能需要两个函数。# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# sel原创 2021-10-01 16:30:16 · 232 阅读 · 0 评论 -
搜索与回溯算法——层次遍历二叉树
剑指 Offer 32 - I. 从上到下打印二叉树层次遍历,用到队列(先进先出).queue.Queue()collections.deque()# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Nonefrom queue impor原创 2021-09-30 18:24:30 · 230 阅读 · 0 评论 -
leetcode 查找算法——二分搜索 剑指04 11
剑指 Offer 04. 二维数组中的查找错误思路:按照对角线往下寻找,这样的话会忽略其他的情况,以为对角线的值所在的行或列就有目标值。在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。三种方法:class Solution: def findNumberIn2DArray(self, matrix: List[List[int]], target: i原创 2021-09-26 14:58:09 · 72 阅读 · 0 评论 -
查找算法—二分搜索 剑指53I II
剑指 Offer 05. 替换空格三种方法class Solution: def replaceSpace(self, s: str) -> str: return '%20'.join(s.split(' '))class Solution: def replaceSpace(self, s: str) -> str: res = [] for c in s: if c == ' ':原创 2021-09-25 16:14:25 · 76 阅读 · 0 评论 -
链表的应用—从尾到头打印链表、复杂链表的复制
剑指 Offer 06. 从尾到头打印链表这题需要看题解的原因是,不知道如何表示节点不存在,以为不存在:head.val==None循环的判断条件是当前节点,而不是head.next# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def rev原创 2021-09-23 16:04:05 · 126 阅读 · 0 评论 -
python的栈和队列——09用两个栈实现队列、30包含min函数的栈
刚开始刷算法题,道理、原理、数据结构都懂,就是不知道所用的语言有哪些第三方库可以简便代码(c++就实现了很多数据类型),只能碰到就记录一下。第一题碰到python的栈和队列,那就搜一下:一:python内置的堆、栈和队列二:栈和队列在python中的实现剑指 Offer 09. 用两个栈实现队列,参考二就能完成任务class CQueue: def __init__(self): self.stack1 = [] self.stack2 = []原创 2021-09-22 21:20:25 · 98 阅读 · 0 评论