
算法
sigoyi00
这个作者很懒,什么都没留下…
展开
-
快排
思路选取第一个数,比它小的放左边,比它大的放右边,递归地处理左右两边的数组就能完成快排。关键在于如何原地将数组分为两块:保存第一个数为cur,这时第一个位置(low)空了出来,用指针high指向最右,指针low指向最左,high从右往左找到第一个比cur小的放到low(此时high位置空出),low再从左往右找到第一个比cur大的放到high,这样循环到low==high。代码#in...原创 2020-04-15 11:34:37 · 271 阅读 · 0 评论 -
求一个集合的全部子集
思路对于集合中的每一个数递归地考虑两种情况,拿或者不拿。代码#include"stdafx.h"#include<vector>#include<set>#include<iostream>#include<string>#include<math.h>#include<algorithm>usin...原创 2020-04-15 11:24:17 · 210 阅读 · 0 评论 -
找出树的最大路径
树的最大路径为节点值和为最大的路径。思路节点值为实数。对于一个节点,当前的最大路径需要考虑四种情况:自己,自己加左子树,自己加右子树,自己加左右子树。但一个节点能返回给上一个节点的路径只有三种情况:自己,自己加左子树,自己加右子树(因为加左右子树的加上父节点就不是一个路径了)。代码#include"stdafx.h"#include<vector>#include...原创 2020-04-14 18:19:50 · 923 阅读 · 0 评论 -
堆排序
思路堆是以数组存储的,但它的逻辑结构是一个完全二叉树,且父节点一定大于它的子节点(大顶堆,小的反之亦然)。堆排序首先需要在数组上建立堆,即从len/2(最后一个非叶子节点)开始往前遍历,如果子节点比自己大就交换并且要继续往下调整(可能子节点的子节点也比自己大)。建立完堆后,输出第一个数就是最大的,再把最后一个数放到第一的位置,重新调整堆。对于插入,可以将一个数放到数组最后,并改用自...原创 2020-04-14 18:00:01 · 138 阅读 · 0 评论 -
KMP算法笔记
建立next数组直观来看,next[i]就表示模式串匹配到i时没成功应该从哪一位重新匹配。所以只用看i前面的字符串和开头字符串有多少重复的,重复数加一就是next[i]的值(模式串下标从1开始)。要遍历整个模式串,时间复杂度O(n)。代码void get_next(char T[], int next[]) [ int i=1; int j=0; nex...原创 2020-04-13 12:01:35 · 124 阅读 · 0 评论 -
背包问题总结
看了很多别人写的文章,准备记点简单的笔记。01背包物品价值v重量w,每种只有一个,求容量一定的背包能装的最大价值。用f[k][v]表示处理了前k个物品(拿或不拿)后容量为v的背包最多能拿多少价值。因为对于物品i,f[k][v]=max{f[k-1][v], f[k-1][v-w[i]]+v[i]}只考虑前一个状态,所以可以用一维数组来记录状态,从前0个物品往下遍历到最后一个物品,但...原创 2020-04-10 17:52:05 · 156 阅读 · 0 评论