算法刷题
文章平均质量分 75
他日若得脱身法
这个作者很懒,什么都没留下…
展开
-
多叉树的构造和其前序后序遍历
【代码】多叉树的构造和其前序后序遍历。原创 2023-09-19 11:13:43 · 134 阅读 · 0 评论 -
拓扑排序-解决依赖路径问题
在华为4-26日的笔试中遇见该问题;给定n个id给定该id依赖其他id根据以上把依赖次数写出来,依赖不能构成循环。原创 2023-04-27 16:03:48 · 40 阅读 · 0 评论 -
图论-匈牙利算法学习
若两个正整数的和为素数,则这两个正整数称之为“素数伴侣”,如2和5、6和13,它们能应用于通信加密。现在密码学会请你设计一个程序,从已有的 N ( N 为偶数)个正整数中挑选出若干对组成“素数伴侣”,挑选方案多种多样,例如有4个正整数:2,5,6,13,如果将5和6分为一组中只能得到一组“素数伴侣”,而将2和5、6和13编组将得到两组“素数伴侣”,能组成“素数伴侣”最多的方案称为“最佳方案”,当然密码学会希望你寻找出“最佳方案”。输出一个整数 K ,表示你求得的“最佳方案”组成“素数伴侣”的对数。原创 2023-04-24 22:40:04 · 190 阅读 · 0 评论 -
算法-生活常识类-防忘记
4、6、9、11月是30天,其他月份为31天。原创 2023-04-07 15:32:19 · 63 阅读 · 0 评论 -
算法-递归
在每一次递归中,函数首先检查当前节点与其父节点的关系,如果两者差值为1,则将当前长度 curLen 加1;**一个经典的递归例子是计算阶乘。**阶乘是指从1到n的所有正整数相乘的结果,通常表示为n!需要注意的是,递归会增加程序的空间复杂度,并且在某些情况下可能会导致堆栈溢出。比如,在一颗二叉树中查找某个特定的值,或者在一个图中查找从起点到终点的最短路径。这个过程中,在第二步中又涉及到计算(n-1)的阶乘,因此可以继续使用递归。如果n大于1,将n乘以(n-1)的阶乘的结果,即n * (n-1)!原创 2023-04-04 11:27:16 · 49 阅读 · 0 评论 -
算法学习-快速排序算法-试题45. 把数组排成最小的数-C++
链接:https://leetcode.cn/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof。输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。这个问题不是数字和数字的排序而是字符串排列之后谁大谁小的排序,涉及到字符串比较,快速排序。拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0。输入: [3,30,34,5,9]来源:力扣(LeetCode)输出: “3033459”输入: [10,2]原创 2023-04-03 17:21:45 · 49 阅读 · 0 评论 -
算法-动态规划-回文子串+最长回文子序列-C++
给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000。关键是比较i和j位置的字符是否一样,如果一样长度加2,不同就保留i+1和j-1时的最大序列长度。示例 1: 输入: “bbbab” 输出: 4 一个可能的最长回文子序列为 “bbbb”。解释:6个回文子串: “a”, “a”, “a”, “aa”, “aa”, “aaa”示例 2: 输入:“cbbd” 输出: 2 一个可能的最长回文子序列为 “bb”。解释:三个回文子串: “a”, “b”, “c”原创 2023-03-29 15:02:10 · 137 阅读 · 0 评论 -
算法-动态规划-子序列和字符串问题-C++
本题中,正确定义dp数组的含义十分重要。dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度为什么一定表示 “以nums[i]结尾的最长递增子序” ,因为我们在 做 递增比较的时候,如果比较 nums[j] 和 nums[i] 的大小,那么两个递增子序列一定分别以nums[j]为结尾 和 nums[i]为结尾, 要不然这个比较就没有意义了,不是尾部元素的比较那么 如何算递增呢。原创 2023-03-28 22:32:18 · 222 阅读 · 0 评论 -
算法-动态规划-121. 买卖股票的最佳时机1-5-C++
所以二维dp数组的C++定义为:确定递推公式还要强调一下:dp[i][1],表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票,这是很多同学容易陷入的误区。达到dp[i][1]状态,有两个具体操作:操作一:第i天买入股票了,那么dp[i][1] = dp[i - 1][0] - prices[i]操作二:第i天没有操作,而是沿用前一天买入的状态,即:dp[i][1] = dp[i - 1][1]原创 2023-03-27 17:00:07 · 598 阅读 · 0 评论 -
算法-动态规划-213.打家劫舍II+337.打家劫舍 III(树形dp)-C++
示例 2: 输入:nums = [1,2,3,1] 输出:4 解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:val2 = max(left[0], left[1]) + max(right[0], right[1]);输入:nums = [2,3,2] 输出:3 解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。原创 2023-03-27 09:57:30 · 159 阅读 · 0 评论 -
算法-动态规划-背包问题-139. 单词拆分-C++
满足两个条件,字符串相等,在此字符串之前的字符串相等。“apple”, “pen” 是物品,那么我们要求 物品的组合一定是 “apple” + “pen” + “apple” 才能组成 “applepenapple”。“apple” + “apple” + “pen” 或者 “pen” + “apple” + “apple” 是不可以的,那么我们就是强调物品之间顺序。输入: s = “catsandog”, wordDict = [“cats”, “dog”, “sand”, “and”, “cat”]原创 2023-03-27 09:02:32 · 68 阅读 · 0 评论 -
算法哈希表总结-C++
只是根据key的哈希值,将元素存在指定位置,所以根据key查找单个value时非常高效,平均可以在常数时间内完成。是库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数是。multimap 中会出现具有相同键的元素序列,它们会被添加到容器中。关联起来的容器,它可以高效的根据单个key值查找对应的value。的底层实现是哈希, 使用unordered_set 读写效率是最高的,它的键值分别是迭代器的first和second属性。原创 2023-03-26 16:25:38 · 35 阅读 · 0 评论 -
算法-BFS-广度有限搜索-迷宫问题
这是最基础的迷宫题的解法,其他笔试题应该根据具体情况具体改。原创 2023-03-25 16:21:03 · 45 阅读 · 0 评论 -
算法-贪心算法-455.分发饼干+376. 摆动序列+53. 最大子序和+122.买卖股票的最佳时机II+55. 跳跃游戏-C++
先求取局部最优,再去求全局最优,贪心点,贪心点。原创 2023-03-24 15:23:33 · 202 阅读 · 0 评论 -
算法-动态规划-背包问题-322. 零钱兑换+(背包问题小结)+完全平方数-C++
01背包问题:最大能装满多少装满有多少种方法问题最少有几个物品能装满组合数就是不允许有重复,一般是先遍历物品再遍历背包容量i ++) {// 遍历物品 for(int j = coins [ i ];j ++) {// 遍历背包 if(dp [ j - coins [ i ] ]!// 如果dp[j - coins[i]]是初始值则跳过 dp [ j ] = min(dp [ j - coins [ i ] ] + 1 , dp [ j ]);} } }原创 2023-03-23 22:31:22 · 204 阅读 · 0 评论 -
算法-动态规划-完全背包问题-518.零钱兑换II-C++
个人感觉比较有难度的地方在于,想明白它是如何计算次数的,根据对背包容量的大于nums[i]限制,以及初始化为1,从前往后遍历dp[j - coins[i]],三条元素决定了,它能够根据num[i]的大小自动添加1。原创 2023-03-23 16:48:03 · 245 阅读 · 0 评论 -
算法-动态规划-完全背包理论基础-C++
有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。01背包和完全背包唯一不同就是体现在遍历顺序上。而完全背包的物品是可以添加多次的,所以要。,为了保证每个物品仅被添加一次。我们知道01背包内嵌的循环是。原创 2023-03-22 17:28:09 · 50 阅读 · 0 评论 -
算法-动态规划-背包问题-474.一和零-C++
解释:最多有 5 个 0 和 3 个 1 的最大子集是 {“10”,“0001”,“1”,“0”} ,因此答案是 4。其他满足题意但较小的子集包括 {“0001”,“1”} 和 {“10”,“1”,“0”}。输入:strs = [“10”, “0001”, “111001”, “1”, “0”], m = 5, n = 3。以输入:[“10”,“0001”,“111001”,“1”,“0”],m = 3,n = 3为例。输入:strs = [“10”, “0”, “1”], m = 1, n = 1。原创 2023-03-22 17:17:39 · 30 阅读 · 0 评论 -
算法-动态规划-背包问题-494.目标和-C++
dp[0]也应该是1, 也就是说给数组里的元素 0 前面无论放加法还是减法,都是 1 种方法。, an, 和一个目标数,S。当我们获得了容量大小为1时,我们有 dp[4]种方法 凑成 容量为5的背包。),凑成dp[j]就有dp[j - nums[i]] 种方法。输入:nums: [1, 1, 1, 1, 1], S: 3。有一个2 的话,有 dp[3]种方法 凑成 容量为5的背包。输入:nums: [1, 1, 1, 1, 1], S: 3。dp[j]代表j的大小的背包里面,有dp[j]种方法。原创 2023-03-22 16:09:11 · 104 阅读 · 0 评论 -
算法-动态规划-背包问题-1049.最后一块石头的重量II-C++
接下来就是如何初始化dp[j]呢,因为重量都不会是负数,所以dp[j]都初始化为0就可以了,这样在递归公式dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。如果没有石头剩下,就返回 0。组合 2 和 4,得到 2,所以数组转化为 [2,7,1,8,1],组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],组合 2 和 1,得到 1,所以数组转化为 [1,1,1],原创 2023-03-22 11:21:05 · 244 阅读 · 0 评论 -
算法-动态规划-背包问题-416. 分割等和子集-C++
这道题目就是一道01背包应用类的题目,需要我们拆解题目,然后套入01背包的场景。01背包相对于本题,主要要理解,题目中物品是nums[i],重量是nums[i],价值也是nums[i],背包体积是sum/2。看代码的话,就可以发现,基本就是按照01背包的写法来的。原创 2023-03-22 10:55:26 · 152 阅读 · 0 评论 -
算法-动态规划-背包问题-C++
在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。原创 2023-03-22 10:11:08 · 722 阅读 · 0 评论 -
算法刷题2
文章目录一、二分法二、使用步骤1.引入库2.读入数据总结提示:以下是本篇文章正文内容,下面案例可供参考一、二分法定义 二分法,即一分为二的方法。通过不断地把函数的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。二分法是一个非常高效的算法,它常常用于计算机的查找过程中。在用二分法进行查找时,查找对象的数组必须是有序的,即各数组元素的次序是按其值的大小顺序存储的。其基本思想是先确定待查数据的范围(可用 [left,right] 区间表示),然后逐步缩小范围直原创 2022-06-09 15:13:11 · 54 阅读 · 0 评论 -
算法刷题1
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、时间复杂度(O(n))二、数组前言解析算法基础,了解算法一些名词,可能会更新一直。一、时间复杂度(O(n))概念:时间复杂度是一个函数,它定性描述该算法的运行时间。O代表最大的时间,也就是运行的上界。O(n)代表循环次数为n,O(n×2)循环次数为2n,一次类推,例如:对于多个循环语句,真正的计算是以最大为准,例如:当循环设定一些条件时,计算以实际条件为准,例如:当有多个条件时,以最复杂的时间复杂度.原创 2022-05-23 15:52:12 · 90 阅读 · 0 评论