C++算法题
文章平均质量分 74
主要面向基础算法
迷茫小玄森
普通蒟蒻大学生一枚~
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【算法】游艇租贷
其中,dp[i]表示从起始点到达站点i的最小成本,dp[j]表示到达站点j的最小成本,而cost[j][i-j-1]表示从站点j到站点i的租用游艇的成本。..n的最短路径,让每个点都作为一次中间点,不断更新起始点到其他点的最短路径,于是就可以得到递推关系式dp[i] = min(dp[i], dp[j]+cost[j][i-j-1]),也就是看看直接到i这个点和先经过j这个点再到i这个点谁的花费比较少,最后dp[n-1]就是我们要求的答案。cost[i][j]表示从站点i到站点i+j+1的租用游艇的成本。原创 2025-02-23 16:09:41 · 497 阅读 · 0 评论 -
【C++算法】01背包问题
如果当前物品的重量Wi小于等于背包的容量j,那么可以选择将该物品放入背包,也可以选择不放入背包,取两种情况下的总价值的较大值,即V(i, j) = max{V(i-1, j), V(i-1, j-Wi) + Vi}。2.还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}。1.包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);原创 2025-02-23 15:40:44 · 716 阅读 · 0 评论 -
【C++算法】疯狂的8
考虑前几个步骤的情况,第一张扑克的 trick(0)=1(边界条件,默认最长子序列长度为1)第二张扑克如果可以与第一张扑克配对,则有 trick(1)=trick(0)+1,否则 trick(1)=1第三张扑克的 trick 值需要考虑前两张扑克能否与它配对,对于不能与 c[2] 配对的扑克不需要考虑,因为对 c[2] 的计算没有贡献。函数crazyEight遍历所有的牌,对每张牌,它会找到与之前的所有牌中符合疯狂8规则的牌中,可以组成最长序列的那个牌,并记录下这个牌的索引号和序列长度。原创 2025-02-23 15:15:07 · 769 阅读 · 0 评论 -
【C++算法】最优服务次序
这道题的关键就是只考虑两个人的情况,让服务时间短的排在前面可以让两个人的等待时间最短,同样的,当人多起来后,我们遍历数组,每次也只考虑相邻的两个人,让服务时间短的排在前面,于是就形成了这道题的贪心策略。也就是说,我们要让比较快搞定的人排在前面,这样后面的人的等待时间就会更短,通过按照服务时间的顺序处理顾客,可以最大程度地减少等待时间,从而得到了最小的平均等待时间。二是排序:根据某些关键变量对输入数据进行排序,这其中的关键就是排序标准是什么,可以是某一类输入数据的大小,也可以是某几类输入数据的乘或和。原创 2025-02-22 15:24:15 · 469 阅读 · 0 评论 -
【C++算法】dijkstra迪杰斯特拉算法
迪杰斯特拉算法的核心思想是通过逐步确定起点到所有其他节点的最短路径,从而找到起点到目标节点的最短路径。通过每次选择当前节点时都选择距离最小的节点,迪杰斯特拉算法可以保证在遍历过程中逐步确定起点到所有其他节点的最短路径。该算法的时间复杂度取决于图的规模,通常为O(V^2),其中V是图中节点的数量。它的思想是通过逐步确定起点到所有其他节点的最短路径,从而找到起点到目标节点的最短路径。2.找到一个还未确认与起点距离的点,,且保证这个点是目前所有未确认与起点距离的点中的最小值,把这个点赋值给temp。原创 2025-02-22 14:52:22 · 582 阅读 · 0 评论 -
【C++算法】判断平衡二叉树
首先我们需要构造出一个二叉树,本代码以例1为例,构造了一棵二叉树,判断其左右子树是否高度差大于1,其实就是通过递归搜索其左右子树的高度,只要左右子树不为空,就让高度加1,然后返回左右子树的值,最后比较左右子树的高度就可以了。在isBalanced()函数中,先判断当前节点左右子树的高度差是否超过1,如果是则返回false,否则递归判断左右子树是否平衡。如果高度差大于1,则返回false,表示不平衡。这样,我们就能通过递归地计算每个节点的高度并比较左右子树的高度差,来判断给定的二叉树是否是高度平衡的二叉树。原创 2025-02-21 14:04:23 · 450 阅读 · 0 评论 -
【C++算法】龙胆虎威倒水题
后根据问题描述和可行的操作,可以得到状态转移图,判断是否可实现,然后使用广度优先搜索(BFS)算法在状态转移图上进行搜索,从初始状态开始,逐步尝试可行的操作,直到达到目标状态。首先,操作的种类是固定的,总共就6种操作方式,我们只需要对每个阶段都执行一次这些操作,就能通过BFS算法判断有没有最优解,如图所示,由于并不是每次都需要把6个操作执行一次,这6个操作实际只需要执行最多两个,因为执行过的操作不会再执行一次,然后这6个操作又是分为对A和对B的操作,所以每次只需要3选2或1就行了。1 给⼀个⽔壶装⽔;原创 2025-02-21 13:56:16 · 576 阅读 · 0 评论 -
【算法】分治法求众数
其本质就是一个二分查找的题目,将找整个数列的众数二分成差两个子数列的个数,只需要将这个数列二分为两个子数列,然后找到左右两边的众数,然后进行比较确认整个数列的众数是什么就可以了。需要注意的点是:与数学上的众数定义不同,这里要求这个众数还必须超过数列长度的一半,所以找到出现次数最多的元素后还需要比较它的出现次数有没有超过数组长度的一半;运用分治思想,我们可以二分查找整个序列,先查找左右两边出现次数最多的元素是什么,然后查找左右两边的众数的出现次数是多少,最后进行比较,返回两边众数出现次数较大的那个数是多少。原创 2025-02-20 14:34:23 · 597 阅读 · 0 评论 -
【算法】大整数乘法
具体来说,就是先把这个大数字二分成多个最多三位的整数,然后让其中的两个整数模拟竖式运算相乘,比如计算1110*11的时候,就是拆分成了10*11和11*11,分别计算两个的结果为110和121,然后模拟竖式运算变成110+12100=12210,这里121后面要补两个0,是因为这里是拆成了两个两位数乘11,如果是一位数的时候,每个乘的结果都要左移一位再相加,这里是两位的话就是左移两位再相加。需要注意的点是二分的时候终止条件需要设置返回值为较小的两个整数的乘积,不然会无法保存到最后二分的结果;原创 2025-02-20 14:18:35 · 873 阅读 · 0 评论 -
【C++算法】堆
因为当一个节点没有左孩子的时候,它只有两种情况,左右孩子都没有,或者只是没有左孩子,如果是第一种情况,说明他是叶子节点,如果是第二种情况,是完全二叉树不会出现的,所以他就一定不会是一颗完全二叉树。首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端,将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1,将剩余的n-1个数再构造成大根堆,再将顶端数与第n-1位置的数交换,如此反复执行,便能得到有序数组。实验要求有三个:建堆,判断是否是完全二叉树,进行堆排序。原创 2025-02-19 14:20:06 · 620 阅读 · 0 评论 -
【C++算法】二叉树
再保证父节点有一个硬币的情况下,可以把多的硬币传给自己的子节点。首先根据题意,这道题目就是移动硬币给其父节点或子节点,在确保自身拥有至少一枚硬币的前提下,把自己多的硬币先传给自己的父节点,如果还有多,再传给自己的子节点,因为二叉树的遍历是从上往下遍历的,自己的父节点若没有硬币,那么只能由自己给,但是自己的子节点没有硬币,可以由子节点的子节点提供,所以优先保证父节点也能拥有硬币,这样就能保证更多的节点拥有硬币。(移动可以是从父结点到子节点,或者从子节点移动到父 节点 )。原创 2025-02-19 13:39:27 · 485 阅读 · 0 评论 -
【C++算法】几种排序算法
具体来说,就是先用二分法递归拆分整个数组,然后两两一对按照升序组成一个数组,之后再合并两个两元素的数组,采用双指针分别从两个数组的第一个元素开始遍历,谁小就先将谁放到新数组里面去,直到指针指向了最后一个元素的后一个位置,这样就合并好了一个两元素数组,直到所有两元素数组都被合并后(如果是奇数个最后一个两元素数组不用管,让他下一次合并再合并就行了),后面就按照相同的方法两两合并四元素数组就行了,直到所有数组都被合并后,形成的新数组就是有序数组,至此完成了归并排序。原创 2025-02-18 14:59:40 · 933 阅读 · 0 评论 -
【C++算法】树的最长同值路径
这个思路是错误的,因为你在DFS的时候,是先搜索完左子树,然后再回溯搜索右子树的,所以可能你根节点和左子树根节点值不同,但是和右子树根节点值相同,但是当你搜索到右子树的时候,那个变量的值已经被你搜索左子树的时候就更新掉了,就会判断不到两个节点值相同。另一个是判断其根节点和左右孩子的值是否相同时,如果是用当前节点和其左右孩子去比他们的值是否相同,显然增加了代码量,且有悖于DFS的思想,极大增加了运行时间,会变成类似BFS搜索的样子,因此该题的正确思路应该是判断当前节点是否与其父节点的值相同。原创 2025-02-17 14:07:02 · 481 阅读 · 0 评论 -
【C++算法】汉诺塔问题
汉诺塔是非常经典的递归问题,我们先考虑只有三个盘子的情况,现在有ABC三个柱子,A上有三个盘子,我们要把A上的三个盘子移动到B上,那么就可以先把A上的一个盘子移动到B上,再把A上的一个盘子移动到C上,然后把B上的一个盘子移动到C上,然后把A上的一个盘子移动到B上,然后把C上的一个盘子移动到A上,然后把C上的一个盘子移动到B上,然后把A上的一个盘子移动到B上。汉诺塔编程,设 a,b,c 是 3 个塔座。开始时,在塔座 a 上有⼀叠共 n 个圆 盘,这些圆盘⾃下⽽上,由⼤到⼩地叠在⼀起。原创 2025-02-17 13:38:04 · 1631 阅读 · 0 评论 -
【C++算法】全排列
需要注意的点有两个:一个是交换元素的时候只让初始点的元素和后面的元素交换,不要和初始点前面的元素交换;2.注意回溯,要保证每个元素都当一次排头,所以要保证选择排头的时候数组为原样,这样才能按照循环1234分别选择排头,不然可能会出现一个元素多次当排头的情况,比如134,则让134分别当排头的时候要保证数组每次都是134不能为其他形式,不然就会变成134的时候选择第一个元素1为排头,后面交换13变成314,然后第二次循环选择第二个元素还是1当排头。本项目采用的方法如下。原创 2025-02-17 12:06:52 · 936 阅读 · 0 评论
分享