
算法
文章平均质量分 74
无知的圆
这个作者很懒,什么都没留下…
展开
-
【leetCode 146】LRU 缓存机制(哈希表+双向链表)
目录思路不使用内置的LinkedHashMap ,使用哈希表+双向链表代码说明使用内置的LinkedHashMap思路具体的思路在LeetCode官方解答中有,里面还有动画和视频,推荐看不懂下面思路的可以去看一下。LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的键值对是最久未使用的。哈希表即为普通的哈希映射(HashMap),通过缓存数据的键映射到原创 2021-07-27 22:58:38 · 755 阅读 · 1 评论 -
最长回文子序列的两种解法(动态规划和反转字符串)
1 题目链接LeetCode2 动态规划这个主要是用dp二维数组来解,应该是用的最多的方法了,这里就不再写了,有兴趣可以去看题解。题解3 反转字符串法这里是利用回文数的特征:正着读和反着读都是一样的,就可以把原有的字符串str1反转变成一个新的str2,然后求出这两个子序列的最长公共子序列数即可,这里就把问题转换为了最长公共子序列问题。例如:最长公共子序列的题目为:最长公共子序列关于这道题LeetCode里面有详细的解答,这里就不写解答和代码了。反转字符串法代码Java:clas原创 2021-07-24 22:00:37 · 325 阅读 · 0 评论 -
【双指针问题】已知链表中含有环,返回这个环的起始位置
双指针双指针一般可以分为两类,一类是快慢指针,一类是左右指针。快慢指针通常是用来解决链表中的问题,比如典型的是判断链表中是否含有环,左右指针主要是用来解决数组/字符串的问题,比如二分搜索等这道题主要是用快慢指针解决快慢指针初始化:两个指针都指向链表头节点head前进:快指针fast在前,慢指针在后判断链表是否有环链表的特点就是每个节点都只知道下一个节点,所以一个指针是无法判断是否有环的,如果链表中不含环,那么这个指针最终会遇到空指针null,这样就知道链表到头了但如果链表中有环,那就会原创 2021-07-22 10:56:34 · 314 阅读 · 0 评论 -
计算机算法设计与分析笔记(三)——动态规划
动态规划1.动态规划的基本要素2.动态规划的基本思想3 动态规划算法设计步骤1.动态规划的基本要素1)最优子结构性质最优化原理:一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。2)子问题重叠性质每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果2.动态规划的基本思想与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的原创 2021-01-03 18:06:37 · 275 阅读 · 0 评论 -
动态规划之图像压缩问题
图像压缩1 问题描述2 问题分析5 递归子结构4 例题5 递归计算最优值6 核心代码1 问题描述2 问题分析没有分段之前,固定的 每8位二进制 截取为一个像素点;现在分段之后,看到一串二进制,我首先要知道多少位截取一个像素点,即告诉我像素点的存储位数 (需3位二进制即可);在此基础上,还要告诉我从什么位置开始像素点的存储位数开始出现变化,即告诉我目前这种存储位数的像素点有多少个 (需8位二进制即可)。5 递归子结构4 例题划分3段的这种方案比前面划分4段的方案少原创 2020-12-07 23:00:26 · 1093 阅读 · 0 评论 -
动态规划之凸多边形最优三角剖分
凸多边形最优三角剖分1 问题定义2 问题分析3 递归结构4 核心代码5 举例1 问题定义凸多边形:把一个多边形任意一边向两方无限延长成为一条直线,如果多边形的其他各边均在此直线的同旁,那么这个多边形就叫做凸多边形。。除去自身A点,以及和自己连接的 2 个点之外,A点和余点间都存在一条弦,即n-3条;这n-3条弦能划分出n-2个三角形2 问题分析3 递归结构4 核心代码和矩阵连乘的代码一样template<class Type>void MinW原创 2020-12-07 20:23:47 · 948 阅读 · 0 评论 -
动态规划之最大子段和问题
最大子段和问题1问题定义2 问题分析思路一:穷举法思路二:分治法思路三:动态规划4 核心代码5 例题1问题定义2 问题分析思路一:穷举法int MaxSum(int n,int a,int &besti,int&bestj){ int sum=0; for(int i=1; i<=n; i++){ int thissum=0; for(int j=i; j<=n; j++){ t原创 2020-12-07 19:26:47 · 418 阅读 · 0 评论 -
动态规划之最长公共子序列
最长公共子序列1 问题定义2 问题分析1 问题定义子序列的含义是 Z中的所有元素都按照顺序出现在X中,此处的按照顺序不要求必须连续,只要先后出现的顺序没有改变即可。2 问题分析从后往前推,如果两个序列中的最后一元素相等,则这个元素一定在最长公共子序列中...原创 2020-12-07 17:50:54 · 217 阅读 · 0 评论 -
动态规划之矩阵连乘问题
矩阵连乘1 问题定义2 问题分析3 举例4 核心算法1 问题定义每计算出一个元素,需要q次乘法,最终得到的矩阵是p * r矩阵,有p * r个元素,因此,计算C需要的乘法次数为q * p * r.2 问题分析3 举例分步思路是沿从左上至右下的对角线进行。首先计算m[1][1], m[2][2],…,m[6][6];然后计算m[1][2], m[2][3],…,m[5][6];再后计算m[1][3], m[2][4],m[3][5],m[4][6];再后计原创 2020-12-07 11:42:47 · 465 阅读 · 0 评论 -
计算机算法设计与分析笔记(二)——递归与分治
二 递归与分治1.递归1.1 定义1.2 双递归函数1.递归1.1 定义递归函数:用函数自身定义的函数递归函数的两个要素:边界条件与递归方程递归算法:直接或间接调用自身的算法1.2 双递归函数当一个函数及它的一个变量是由函数自身定义时,则称这个函数为双递归函数;例如:Ackerman函数,其定义如下:A(1,0)=2A(0,m)=1 m≥0A(n,0)=n+2原创 2020-12-06 22:39:13 · 593 阅读 · 0 评论 -
分治法之棋盘覆盖问题
棋盘覆盖1.问题描述2.问题分析3.分治算法4 时间复杂性5 代码1.问题描述4k为总的方格数, 1为特殊方格, 每个L型骨牌有3个方格,所以除以3。2.问题分析对于2k*2k的棋盘有以下特点棋盘为正方形,则可以考虑将问题分为规模相等的子问题、棋盘上有一个残缺的方格,则分解后的子问题中也应该有一个残缺的方格3.分治算法4 时间复杂性5 代码#include <iostream>using namespace std;# define N 1原创 2020-12-06 18:59:16 · 555 阅读 · 0 评论 -
分治法之二分搜索技术
二分搜索技术1 问题定义2 基本思想3 核心算法4 时间复杂性5 金块问题1 问题定义给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。例如:设n=6,a=[1 3 5 7 9],要找出特定元素x=9;2 基本思想3 核心算法int function binary-search(Type a[ ], const Type & x, int n) { int left = 0; int right = n-1;原创 2020-12-06 17:33:20 · 1305 阅读 · 0 评论 -
递归之整数划分问题
整数划分1 问题定义2.问题分析3 核心算法4 具体代码1 问题定义2.问题分析最大加数等于6的划分个数有1个;最大加数等于5的划分个数有1个;最大加数等于4的划分个数有2个;最大加数等于3的划分个数有3个;最大加数等于2的划分个数有3个;最大加数等于1的划分个数有1个;解题思路:对于数据n,递归计算最大加数等于x的划分个数+最大加数不大于x-1的划分个数,最大加数x从n开始,逐步变小为n-1,…,1,从而求解出问题m=1,最大加数不大于1,意味着小于等于1,但是不可能小于原创 2020-12-06 11:09:19 · 321 阅读 · 0 评论 -
递归之全排列问题
全排列问题1.问题定义2 核心算法3. 算法分析4 实现代码1.问题定义2 核心算法Template<class type>void Perm(Type list[ ], int k, int m){//产生list[ ]数组中从k到m元素的全排列. if (k==m) {//只剩下一个元素 for (int i=0;i<=m;i++) cout<<list[i];原创 2020-12-06 10:19:34 · 271 阅读 · 0 评论 -
计算机算法设计与分析笔记(一)——算法概述
一 算法概述1.算法的性质2.程序与算法的区别与内在联系3.算法复杂性分析3.1 时间复杂性3.2 复杂性的渐进性态3.2.1 定义3.2.2 大O表示法 (算法运行时间的上限 )3.2.3 大Ω表示法 (算法运行时间的下限)3.2.4 θ表示法4.例题1.算法的性质输入:由外部提供的量作为算法的输入,0个或多个输出:算法产生至少一个量作为输出确定性:组成算法的每条指令都是清晰的,无歧义的有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的2.程序与算法的区别与内在联系原创 2020-12-01 22:16:32 · 573 阅读 · 0 评论 -
浙大PTA基础编程题目集(编程题)
7.1厘米换算英尺英寸如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸。输入格式:输入在一行中给出1个正整数,单位是厘米。输出格式:在一行中输出这个厘米数对应英制长度的英尺和英寸的整数值,中间用空格分开。输入样例:170输出样例:5 6题目不难,唯一算是难点的地方在于:解答者容易陷入题目所给公式的误区里,总想着把公式倒过来便原创 2020-11-29 22:12:22 · 4911 阅读 · 0 评论