
算法与数据结构
算法题解
_愚者
这个作者很懒,什么都没留下…
展开
-
动态规划-01背包
01背包背包最大重量为4。物品为: 重量 价值物品0 1 15物品1 3 20物品2 4 30问背包能背的物品最大价值是多少?碰到是否可以使用DP,我们需要思考是否存 在最优子结构,并且有重复子问题。通常情况下暴力解法就是你思考最优子结构的作用。暴力解法:我们在选择物品时有两种选择:选 或 不选,所以递归如图所示:这样根节点的最优选项为:选0号物品 与 不选0号物品 中最优的那个。其他非叶子节点亦然。而DP是自底向上进行的,当背包大小为1的时候原创 2021-11-01 09:48:54 · 323 阅读 · 0 评论 -
动态规划-不同二叉搜索树
不同的二叉搜索树给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。输入:n = 3输出:5示例 2:输入:n = 1输出:1来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/unique-binary-search-trees著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。示例1:画图所示规律如图:二叉搜索树的定义,父原创 2021-11-01 09:48:07 · 243 阅读 · 0 评论 -
动态规划-整数拆分
整数拆分给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。说明: 你可以假设 n 不小于 2 且不大于 58。来源:力扣(LeetCode)链接:https://leetcode-c原创 2021-11-01 09:46:09 · 593 阅读 · 0 评论 -
动态规划-不同路径
不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径? 示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下2. 向下 ->原创 2021-11-01 09:45:22 · 768 阅读 · 0 评论 -
动态规划-使用最小花费爬楼梯
使用最小花费爬楼梯数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。 示例 1:输入:cost = [10, 15, 20]输出:15解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯原创 2021-11-01 09:44:52 · 241 阅读 · 0 评论 -
动态规划-爬楼梯
爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶来源:力扣(LeetCode)链接:https:原创 2021-11-01 09:44:13 · 180 阅读 · 0 评论 -
动态规划-编辑距离
编辑距离编辑距离就是通过增删替换三种操作,计算最少通过几次操作能将一个向量转换为另一个向量。这个操作次数就是编辑距离。例如:使用两个指针分别指向尾部。过程如下:上词为源词,对源词进行增删替换当进行添加时,j-1当进行删除时,i-1当进行替换时,i-1,j-1边界为:当上词i=-1时,剩下的编辑距离为将下词所有当前j之前的字符增加到上词中。当下次j=-1时,剩下的编辑距离为将上词所有i之前的字符删除。# count为编辑距离count = 0i = dj =原创 2021-11-01 09:43:43 · 1605 阅读 · 0 评论 -
图算法-单源最短路径-Dijkstra算法
Dijkstra算法算法描述:将图转化成邻接矩阵。行为当前点,列为目标前,矩阵中元素为当前点到目标点的距离。与本点的距离为0,与直接相连的点距离为对应距离,与不直接相连点的距离为无穷。将所有顶点分为两部分:**已知最短路径集合P和未知最短路径集合Q。**使用一个数组记录P、Q,数组中为1的部分为集合P中的元素,数组中为0的部分为集合Q中的元素。初始时P集合中只有源点v。设置dist距离数组。dist数组为源点到各点的最短距离。初始dist表为:到源点的距离为0,到与原点直接相连的点u的原创 2021-11-01 09:42:07 · 331 阅读 · 0 评论 -
搜索算法-二分查找-34.在排序数组中查找元素的第一个位置和最后一个位置
34.在排序数组中查找元素的第一个位置和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗? 示例 1:输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]示例 2:输入:nums =原创 2021-11-01 09:40:39 · 186 阅读 · 0 评论 -
搜索算法-二分查找-1.两数之和
1.两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。 示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,原创 2021-11-01 09:39:50 · 323 阅读 · 0 评论 -
搜索算法-二分查找-367.有效完全平方数
二分查找注意!二分查找时也要注意不变量。 如果你调用输入的是 [left, right](或[left, len(nums)-1]),则你的终止条件是if left > right。因为你的区间是左闭右闭的,所以当left == right的时候是有意义的。367.有效完全平方数给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。进阶:不要 使用任何内置的库函数,如 sqrt 。 示例 1:输入:num = 16原创 2021-10-30 11:23:56 · 214 阅读 · 0 评论 -
堆-优先队列-703.数据流中的第K大元素
优先队列优先队列的底层是堆,堆是一个具有特殊属性的完全二叉树。堆分为最大最小堆:最大堆的父节点永远比儿子节点大最小堆的父节点永远比儿子节点小时间复杂度:最大堆(最小堆)查找最大节点(最小节点)的时间复杂度是 O(1)插入/删除堆中节点的时间复杂度是 O(logn)查找topK的时间复杂度为 O(logn)堆的底层就是一个数组,它的一个堆特性是:第i个位置的元素应小于第 i * 2、i * 2 + 1 位置的元素。(那两个元素是i位置元素的子节点)703.数据流中的第K大元素设计一原创 2021-10-30 11:22:39 · 169 阅读 · 0 评论 -
堆-python中的堆heapq
python中的堆heapqpython中并没有像java那样封装一个堆类。而是提供了一个heapq堆函数,它可以将list转化为堆。heapq中的堆是最小堆!heapq中拥有的函数:heapq.heapify(list):将list转换成堆,直接对list进行修改,不返回值。heapq.heappush(heap, val):将val添加进堆中。应注意!添加的数组应为堆数组(也就是heapify后的),如果是普通数组它添加时并不会按照你想的方式添加(因为添加是按照堆的规则添加的)。h原创 2021-10-30 11:21:13 · 359 阅读 · 0 评论 -
链表-环形链表-141.判断有环无环
141.环形链表给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:输入:head =原创 2021-10-30 11:19:26 · 154 阅读 · 0 评论 -
链表-反转链表-24.两两交换链表中的节点
24.两两交换链表中的节点给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs著作权归领原创 2021-10-30 11:18:22 · 140 阅读 · 0 评论 -
链表-反转链表-206.反转链表
206.翻转链表给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例 2:输入:head = [1,2]输出:[2,1]示例 3:输入:head = []输出:[]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-linked-list著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明原创 2021-10-30 11:17:34 · 123 阅读 · 0 评论 -
数组-模拟-螺旋矩阵
螺旋矩阵螺旋矩阵就是模拟路径进行螺旋,但是要注意不变量。输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]来源:力扣(LeetCode)链接:https://leetcode原创 2021-10-30 11:16:39 · 146 阅读 · 0 评论 -
数组-前后指针-26.移除数组中的重复项
26.移除有序数组中的重复项给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝int len = rem原创 2021-10-30 11:15:37 · 145 阅读 · 0 评论 -
数组-前后指针-27.移除元素
27.移除元素给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参原创 2021-10-30 11:14:43 · 145 阅读 · 0 评论 -
数组-前后指针-283.移动0
283.移动零给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/move-zeroes著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。使用双指针法,前指针指向第一个零项,后指针寻找非零项。当每次后指针找到非零项后,与前指针进行swap,前后指针加一。原创 2021-10-30 11:13:43 · 98 阅读 · 0 评论