
算法
文章平均质量分 71
_Yangtze
这个作者很懒,什么都没留下…
展开
-
LeetCode刷题整理——背包问题
大佬的动态规划题解完全背包(物品数量无限)LeetCode 377 组合总和 4只需要知道有多少种组合(其实是求排列,与顺序有关),不需要知道是哪些组合。最开始以为和LeetCode 39很像,用回溯剪枝搜索,超时(回溯的复杂度很大)。这题不用知道具体的组合可以不用回溯,属于背包问题中的完全背包问题。然后这题用C++的话,最后一个用例会超过INT_MAX,所以比java等要加一个判断条件。用maximum[i] 表示背包里放了重量和为i 的物品时的方案数。初始状态:maximum[0] 什么都没原创 2021-07-19 19:42:50 · 903 阅读 · 0 评论 -
LeetCode刷题整理——二叉树层序遍历,TOP K
二叉树层序遍历要标记一层遍历的结束,可以先计算出队列里面有多少个元素,然后一次性处理完这些元素。原来的方法是用一个指针指向下一层的结尾(不好写)原创 2021-04-20 13:03:49 · 334 阅读 · 0 评论 -
LeetCode刷题整理——动态规划
牛客NC68跳台阶(递归)分析过程:某一个状态可能是怎么得来的。(NC34求路径问题也一样)比如说跳上第n级台阶(n>2)可能是通过跳2级台阶来的,也可能是跳1级台阶来的。那么跳上第n级台阶的方法数就是“最后一步跳2级”和“最后一步跳1级”的方法数之和,即F(n)=F(n-1)+F(n-2)。使用递归方法的时间复杂度高。非递归方法,用了斐波那契数列的规律。要跳几级台阶就是斐波那契数列1,2,3,5,8…中的第几个数。即: int jumpFloor(int number) {原创 2021-04-20 12:57:06 · 445 阅读 · 0 评论 -
LeetCode刷题整理——回溯、树的中序
回溯LeetCode 17 电话号码的字母组合LeetCode 22 括号生成原创 2021-04-20 12:51:22 · 313 阅读 · 0 评论 -
洛谷P1308 统计单词数
??我太难了,C++一碰到字符串就脑阔疼,指针什么的根本不明白(菜鸡本人)。做法一#include <iostream>#include <cctype>#include <cstdio>#include <cstring>using namespace std;void strlower(char* a) { for (int i...原创 2019-10-07 23:52:25 · 399 阅读 · 0 评论 -
回溯法求解素数环问题
基本思路就是深度优先搜索,当一条路走不通的时候就回头换一种走法。非递归版参考:https://blog.youkuaiyun.com/tterminator/article/details/50933455递归版:public class PrimeCircle2 { //递归调用DFS public static void DFS(int[] place,int k,int[] visited)...转载 2019-06-10 17:11:25 · 1709 阅读 · 0 评论 -
分支限界、回溯法解决01背包问题
分支限界搜索,以广度优先或最小耗费优先的方式搜索解空间。其选择下一扩展结点的策略是:在每一个活结点处,计算一个函数值(限界),并根据函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。针对01背包问题,计算某个结点上界的函数为:现有价值+剩余容量*该物品单位容量的价值???对于每一个非叶活结点,其左孩子表示装入下一个物品,...原创 2019-06-10 16:59:22 · 5727 阅读 · 0 评论 -
贪心法求解矩阵连乘和01背包
思路来源:https://www.xuebuyuan.com/973538.html贪心求矩阵连乘,不一定得到最优解。在另一篇动态规划求矩阵连乘的博客里举的那个例子是可以得到最优解的。但是也很容易举反例,比如下面这个,用下面的贪心求的是16000:/** * 想用贪心来写个矩阵连乘试一试 * 思路:把矩阵按公共的行列从大到小排序,然后按此顺序计算 * @author yangtze ...原创 2019-05-29 20:46:38 · 978 阅读 · 1 评论 -
最小生成树 Prim算法和Kruskal算法
Prim算法和Kruskal算法都是基于最小生成树的MST性质的贪心策略。只是两者处理的对象不一样,一个是从点出发,一个是从边出发。Prim算法设源点为v1,初始时U={v1},假设补集V-U={v2,v3,v4,v5,v6}。第一次操作从v1到v2…v5的五条路径长度中选一个最小的,选中的vi从V-U删除,加入U。之后的操作类似,都是从所有u∈U,v∈V-U中找一个最短的边(u,v),将...原创 2019-05-17 11:26:18 · 834 阅读 · 0 评论 -
最短路径算法 Dijstra、Floyd、Bellman-Ford
算法课这个女人居然还要弄期中考试。。每次上完课都觉得怀疑人生,早知道从第一节课开始就应该自己在下面自学了(卑微)。今天回顾一下两个最短路径算法吧。之前课设写过,但是发现已经忘记了。。(我除了菜什么都没有)最短路径算法最短路径算法常见的有Dijstra和Floyd。Dijstra采用的是贪心策略,常用于解决单源点问题,贪心策略是不能回头的,所以Dijstra不能用于有负权的图(因为在此算法中...原创 2019-05-03 13:36:18 · 447 阅读 · 0 评论 -
动态规划求解矩阵连乘问题
填坑填坑,动态规划第二篇,想写矩阵连乘问题。问题描述:这个问题描述有点复杂,放张图解释:也就是选择最优的计算次序,以求乘法次数最少。问题分析:这里也可以采用自底向上的思路。每个子问题的最后一步一定是两个矩阵相乘,现在假设要求的是A1 * A2 * A3 * … * An的最优计算次序,我们取中间连续的一段,从Ai 到 Aj 作为子问题,记M(i , j)为其最优解。...原创 2019-04-27 15:05:46 · 1665 阅读 · 0 评论 -
动态规划求解01背包问题
近期事情多,且老师讲动态规划讲得云里雾里。。于是又没有跟上进度,菜鸡终于要来填坑了。动态规划动态规划和分治法有些相像,都是把一个问题分成了很多子问题来求解,但是不同的是动态规划会记忆之前解决的子问题的结果,避免了重复计算。判断一个问题是否能用动态规划求解,要看它是否能划分成合适的子问题,然后写出递推关系式。动态规划得到的解一定是最优解。01背包问题(1)问题描述:现有n件物品,每件都有...原创 2019-04-22 21:35:05 · 5404 阅读 · 1 评论 -
堆排序算法实现 java
堆排序算法的基本步骤:(1)将无序序列构建成一个堆,再根据需求构建成大根堆或小根堆(此处以大根堆为例);(2)此时的堆顶元素即为最大元素,将其与堆最末的元素交换,沉到数组末端(即不会再参与调整);(3)交换之后重新调整堆为大根堆。(4)重复步骤(2)(3)直到整个序列有序。import java.util.Arrays;public class HeapSort { public ...原创 2019-04-08 20:54:44 · 160 阅读 · 0 评论 -
寻找第K小的数
立个flag,希望可以坚持至少跟着算法课的进度来整理和实现有关算法(虽然我已经感觉到了flag要倒的气息。。)手动微笑脸。寻找第k小的数这是一个很常见的问题,在乱序的n个数中寻找到第k小的数,很容易想到先排序再取第k个数的方法,但是我们要降低时间复杂度,并用上减治的思想。方法一 快速选择算法基本思路跟快排很像。每次快排我们会把数分为三组,大于基准,小于基准,基准本身。我们需要在每次快排后判...原创 2019-03-23 23:36:17 · 3240 阅读 · 0 评论