数据结构与算法
文章平均质量分 59
一千次晚安。
凡事发生必将有益于我
展开
-
动态规划的简单进阶
剑指 Offer 49. 丑数我们把只包含质因子 2、3 和 5 的数称作丑数该句话的意思是这个数的质因子只能有2,3,5.因而进行数学推广可以得知大数值的丑数一定是某一个丑数的2,3,5的倍数,抽象成动态规划的状态转移方程为:dp[i]=dp[x]*2/3/5.该题的难点在于得知初始状态是1的情况下如何进行状态转移不遗漏掉数,方法为使用a,b,c三个指针来确定2,3,5×过的数在dp数组中的位置。(理解为一个丑数可以推广为三个丑数,分别是×2,3,5,这是由性质得到的。我们每次去ax2,b原创 2021-11-18 22:26:15 · 276 阅读 · 0 评论 -
搜索与回溯算法
剑指 Offer 38. 字符串的排列该题是经典的字符串全排列该题通过思考可以明白,字符在排列的时候,每一个位的字符只能使用一次,例如在首位考虑多个可能性的时候,首位一变更后,原先的首位应出现在后。图片来源:力扣该图为使用深度优先搜索思路并且添加了剪枝的思路。定义一个深度优先搜索函数,参数x为当前进行排列的第几位,回溯条件即为x等于字符串的最后一个字符,条件满足往结果添加当前排列好的字符串。剪枝的思路运用到代码里是使用set集合来存储使用过的字符串,当字符串中有重复字符的时候..原创 2021-11-18 21:55:49 · 336 阅读 · 0 评论 -
滑动窗口与队列
滑动窗口的模板:let left = 0, right = 0; while (right < s.size()) {` // 增大窗口 window.add(s[right]); right++; while (window needs shrink) { // 缩小窗口 window.remove(s[left]); left++; }}我认为滑动窗口的关键点在于移动右指针时的各种操作,..原创 2021-11-12 20:58:07 · 539 阅读 · 0 评论 -
有关模拟的算法题型
剑指 Offer 62. 圆圈中最后剩下的数字该题是著名的约瑟夫环问题,可以使用动态规划来解决,它是有数学规律的。f(n)可以由f(n-1)推出,图片转自LeetCode我们在第八次与第七次进行分析,在第八次删除掉c以后会从d开始,而在第七次补充上c以后,需要右移m即可与第八次一致,推广出:(f(n-1)+m)%n = f(n),说明约瑟夫环问题只要得知m的值,n值只需要循环进行计算就可以递归得出,因为m有可能大于n,所以会进行求余操作。必有f(1)=0code:/**.原创 2021-11-11 21:00:19 · 217 阅读 · 0 评论 -
有关数学的算法题(摩尔投票,贪心算法,滑动窗口双指针)
剑指 Offer 39. 数组中出现次数超过一半的数字该题因为涉及到计数问题,所以一定是可以用哈希表解决的。优化方法是使用摩尔投票法,我们假设当前的数即为众数并且权重加一,之后如果不相等则权重减一,权重为0时重新定义当前数为众数,重复前面的操作。因为众数的个数是大于数组的一半的,所以无论怎么去操作,最后权重一定是大于0的,一定可以找到众数。/** * @param {number[]} nums * @return {number} */var majorityElement =原创 2021-11-04 17:54:12 · 201 阅读 · 0 评论 -
LeetCode位运算
摘自菜鸟教程^可以利用实现相加并且不进位(a^b 为a+b在不考虑进位的情况下)&可以实现地板除以2,实现进位(a&b <<1 为a+b的进位)剑指 Offer 65. 不用加减乘除做加法在该题不允许使用加减乘除,因此使用位运算,在我们^得到不进位的情况下加上&<<1就是+号的效果。但是要注意在进位情况下,想要添加上进位效果又要使用+号,因此需要再次进行不进位+进位,当进位的值被一直^到0以后,就可以实现加法思路:c = ...原创 2021-11-03 23:58:35 · 126 阅读 · 0 评论 -
分治算法的题型以及与动态规划的区别
动态规划属于是分治算法的一种,而不同的是分治算法在大部分情况下是自顶向下进行求解,将问题分解为各个小问题再合并,而动态规划大部分是定义dp数组,求解小问题后进一步自底向上进行求解大问题。分治算法步骤:1>分解:将原问题分解为各个小问题。2>求解:如果可以简单的进行求解则解出来,否则再次进行1>分解。3>合并:将各个子问题合并为原问题最终解。动态规划步骤:1>状态定义2>状态转移方程3>初始状态4>返回值动态规划的三个特征:1最优子结原创 2021-11-03 16:37:27 · 315 阅读 · 0 评论 -
深度优先搜索进阶(DFS二叉树的深度问题,最近祖先问题)
剑指 Offer 55 - I. 二叉树的深度使用递归注意在回溯时的返回即可,返回值应为:左子树的深度与右子树的深度最大值加上1,因为在到最底下时左右都为空则为1,一步一步回溯即可。/** * Definition for a binary tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } *//** * @param {TreeN原创 2021-11-02 09:22:35 · 120 阅读 · 0 评论 -
排序算法的简单进阶(快速排序算法,获取中位数的双指针写法)
剑指 Offer 61. 扑克牌中的顺子图片源自:力扣该题的关键在于找到扑克牌连子的规律,如果五张牌连着,在不考虑癞子牌的情况下无论如何都应是最大牌减最小牌为4。如果再去掉癞子并且不考虑重复牌的情况下,应该是小于5(比如00125,00235无论怎样都会是小于五,因为没有重复牌的情况下,最多会有两个癞子,如果满足链子的情况下,只要其最大减最小会小于五,加上癞子总会满足情况)使用集合来确认有重复牌直接return false;设牌最小为14,牌最小为0,方便确定最大牌点数与最小牌点数.原创 2021-11-01 17:51:05 · 133 阅读 · 0 评论 -
搜索与回溯算法:DFS(深度优先搜索)
深度优先搜索:1.确定回溯终止条件2.重复生成其他可能我的LeetCode题解:力扣,剑指 Offer 12. 矩阵中的路径力扣,剑指 Offer 13. 机器人的运动范围------------------------------------剑指 Offer 12.矩阵中的路径根据题目分析要找到矩阵中与word字符串第一个值相同的下标,并利用下标进行dfs匹配word字符串后面的单词是否一致。首先有两层循环来寻找与word第一个值相等,并将i,j,k传递给dfs(k为字符.原创 2021-10-24 14:09:19 · 1719 阅读 · 0 评论 -
动态规划的算法题型总结
动态规划(DP 即 Dynamic Programming)理解为将一个大问题拆分为一堆小问题,并且这些小问题不会被重复的计算。动态规划分为自顶向下top-down(递归时间复杂度以斐波那契数为例n^h-1,空间复杂度为n)和自底向上bottom-up(效率高,最优解,一般一维dp使用滚动数组来优化)。动态规划的解题步骤:1:状态定义(定义dp数组)2:转移方程(拆分问题确定dp数组自底向上的转移方程)3:初始状态(确定最开始底部的dp数值):4:返回值(返回dp数组当中的哪一个值为最终结果原创 2021-10-23 14:37:33 · 412 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构(判断是否为一个数的子树)
剑指 Offer 26. 树的子结构判断b树是否为a树的子树,首先需要先应用一个先序遍历来寻找与b树根结点相同的a树的子结点,之后再进姓递归判断每一册是否相同。该题难点在于递归,掌握以后应该关于树的子结构题可以通杀。图片转自:力扣先进性先序遍历(直接利用原题的函数进行遍历就可以),在遍历的时候添加上条件即可(利用python特性可以实现一行判断)。递归永远先写终止递归进行回溯的条件,该题终止递归的条件为b树无根结点(即B为空)因为要判断b树的根结点是否与a树的当前节点相同所.原创 2021-10-18 23:50:46 · 102 阅读 · 0 评论 -
二叉树镜像的题:剑指 Offer 28. 对称的二叉树,剑指 Offer 27. 二叉树的镜像
剑指 Offer 27. 二叉树的镜像和广度优先搜素的思路一样,一定是会遍历所有的节点的,但是因为要输出的是二叉树的镜像,所以在遍历的时候,需要将左右结点做一个交换的处理,这样就可以保证输出的为二叉树的镜像。(每一层都进行左右结点交换处理之后添加进队列当中)依然是开头先新建一个队列,并且添加根结点进队列。(感觉和广度优先搜索二叉树没有区别,只是多了一步)import collectionsclass Solution: def mirrorTree(self, root: TreeN原创 2021-10-18 23:14:58 · 82 阅读 · 0 评论 -
队列+广度优先搜索(bfs)剑指 Offer 32 . 从上到下打印二叉树
python当中collections有一个deque双向队列,其popleft()可以实现从队列中出时间复杂度为o(1)剑指 Offer 32 - I. 从上到下打印二叉树直接使用队列,初始队列中为root,为从左到右便利则依次往队列中添加二叉树的节点即可,当队列为空则证明便利结束加一个节点利用popleft()队列出一个import collectionsclass Solution: def levelOrder(self, root: TreeNode) -> Li原创 2021-10-18 22:37:30 · 76 阅读 · 0 评论 -
双指针与二分法的应用:剑指 Offer 04. 二维数组中的查找,剑指 Offer 11. 旋转数组的最小数字
剑指 Offer 04. 二维数组中的查找由题意可以得知一个n x m的矩阵,性质是自上往下自左往右均为递增。需要查找到目标值,由题意将矩阵旋转45度可以发现从右上角开始向下为递增,向左为递减,由此可以用双指针判断目标值的大小,根据情况写判断即可class Solution: def findNumberIn2DArray(self, matrix: List[List[int]], target: int) -> bool: i,j = len(matrix)-原创 2021-10-18 22:04:55 · 45 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制
剑指 Offer 35. 复杂链表的复制图片转自力扣该题在复制时的难点是新链表创建之后,random指针是无法指向未进行创建的节点的在想到新链表可以进行哈希映射关系后,先循环生成旧链表与新链表的映射关系,再循环对next和random进行赋值即可要注意在对next和random进行赋值时不能使用直接dict[].random的方式获得,因为题目说过可能指向null值class Solution: def copyRandomList(self, head: 'Node'..原创 2021-10-13 15:08:09 · 30 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表,剑指 Offer 24. 反转链表
两个题均为递归算法的应用剑指 Offer 06. 从尾到头打印链表图片来源:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/solution/mian-shi-ti-06-cong-wei-dao-tou-da-yin-lian-biao-d/直接使用题目给定的函数进行递归,注意写递归时先写终止递归的判断条件并且return开始回溯 def reversePrint(self, hea原创 2021-10-13 15:00:57 · 53 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈
剑指 Offer 30. 包含min函数的栈图片转自:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof/solution/mian-shi-ti-30-bao-han-minhan-shu-de-zhan-fu-zhu-z/题目要求实现四个函数,分别是push,pop,top,min,并且要求min的时间复杂度为1我们在以往经验得出想要获取最小值的排序并没有时间复杂度为1的算法,因此想要实现时间复杂度为1原创 2021-10-11 17:05:05 · 43 阅读 · 0 评论 -
python利用辅助栈实现两个栈的队列
剑指 Offer 09. 用两个栈实现队列图片转自LeetCode:力扣使用stack1为队列使用,stack2为辅助栈当在给队列添加元素时,先将stack1队列中所有的元素移动到辅助栈stack2中,之后将新元素添加推入队列stack1当中,再将stack2中的所有元素移动到队列stack1当中在删除时判断stack1是否为空,不为空则直接删除。class CQueue: def __init__(self): self.stack1 ,self.st.原创 2021-10-11 16:35:42 · 153 阅读 · 0 评论