
算法与数据结构
文章平均质量分 60
shendezhuti
本科湖南大学电子科学与技术学士学位 正攻读美国乔治华盛顿大学计算机硕士学位
展开
-
密码学初识
1.前言转专业同学对于密码学可能了解都比较少,在慕课网上看到了一门课,简单讲了一下密码学以及在Java中相关的使用。特此做一个学习笔记2.密码常用术语明文:待加密的信息密文:经过加密后的明文加密:明文转化为密文的过程加密算法:明文转化为加密的算法加密密钥:通过加密算法进行操作加密的密钥解密:将密文转化为明文的过程解密算法:将密文转化为明文的算法解密密钥:通过解密算法进行解密操作的密钥密码分析:截获密文者通过分析截获的密文从而推断出原来的明文或密钥的过程主.原创 2021-02-03 18:20:47 · 465 阅读 · 0 评论 -
UCBCS188 AI学习笔记(2)informed search (启发函数搜索)
搜索的启发函数启发函数是什么?一个估计离重点还有多少距离的函数。 为特殊的搜索问题设计 例子:曼哈顿距离,欧几里得距离贪心搜索策略:扩展你认为最接近距离的结点通常情况:最快的带你走向一个错误的目标最差情况:像一个没有错误指令的DFSA*搜索算法会将当前已走过的代价结合启发函数一起决定如何扩展结点。可以这么理解 A* = UCS + Greedy...原创 2020-03-28 07:10:50 · 799 阅读 · 0 评论 -
小菜找实习——阿里3月27日场笔试第一题
题目描述小强现在可以将任何一个字符串的一位以O(1)的代价移到末尾现在给定一个字符串S,字符串T。求问最少用几次可以将S以上述的方法移动变成T样例输入acdkckad样例输出2将a移到最后变成cdka,将d到最后变成ckad一开始去想求公众最长子序列,然后以字符串的长度减去这个序列长度,差点把自己写死。最后也没跑过,那时候心态有点小崩。(后来做完和大家...原创 2020-03-27 11:33:45 · 577 阅读 · 2 评论 -
动态规划实战16 leetcode-198. House Robber
确定状态:dp[i]表示歹徒抢到第i个房子时候最大收益对于一个歹徒来说:到第i个房子不抢,那么在此时他的收益就是到i-1个房子时候的收益第i个房子抢了,那么最大收益就是抢第i个房子的收益加上抢到第i-2个房子收益和。状态转移方程dp[i] = max{dp[i-1] , dp[i-2]+nums[i-1] }初始条件和边界条件dp[0]=0dp[1]=nums...原创 2020-03-27 05:46:36 · 153 阅读 · 0 评论 -
动态规划实战15 leetcode-256. Paint House
确定状态:这个题其实和之前的那个阿里矩阵题是一样的,只不过是状态转移方程稍有不同,paint house就是把相邻的情况排除了。dp[i][j]代表从0paint到i号房子,在i号房子涂j号色时用的最少costs。因此状态转移方程如下dp[i][j] = dp[i][j] + min{ dp[i-1][k]} 其中k=1....m 且k!=j初始条件和边界条件dp[i][...原创 2020-03-27 04:57:12 · 245 阅读 · 0 评论 -
动态规划实战14 leetcode-312. Burst Balloons
这道题目是hard类题,笔者表示没碰到过第一次遇到真的很难写出来。首先如果用暴力搜索的方法,对每种情况进行搜索判断,那么需要有n*n-1*n-2*....*1 = n! 显然这样的时间复杂度太高那么接下来想到的就是如何用dp去解决问题。如何确定状态和找出状态转移方程一直是dp问题的难点,这道题也不例外。确定状态c[i][j] = maxCoins(nums[i] - nums[...原创 2020-03-27 02:36:11 · 148 阅读 · 0 评论 -
动态规划实战13 leetcode-121. Best Time to Buy and Sell Stock
前言:这道题目实可以用 Kadane's Algorithm解决对于kadane's algorithm 我们可以这么想,假设输入是[7,1,5,3,6,4]那么我们可以通过这个数组得到在每一天前买 后一天卖的数组(称收益数组) [-6,4,-2,3,-2]实际上这样就转换成了什么问题?没错!maximum subarray!我们只要求收益数组的maximum subar...原创 2020-03-26 11:38:48 · 134 阅读 · 0 评论 -
小菜找实习——阿里3.25场笔试第一题(矩阵数组最小差值和)
明天晚上就要笔试了,又有新的原题来参考练手了,这道题如果不知道viterbi算法可能通过dp有点难做出来。所以说学习是永无止境的hhh!图源自牛客论坛上(话说他们是怎么截图的,难道这样不算作弊吗,不太懂笔试的规则)输入描述45 9 5 4 44 7 4 10 32 10 9 2 3输出描述5确定状态Viterbi算法是说每到一个状态就记录下到当前状态的最...原创 2020-03-26 01:57:46 · 731 阅读 · 0 评论 -
动态规划实战12 leetcode-472. Concatenated Words
这道题目实际上可以用到之前的leetcode139中的算法word break我们先对words数组排序,排序的目的是减少后续的比较然后在每次循环里面直接判断当前的words[i]是不是可以由字典里面的数字组成。注意我们写代码的顺序,要等每次判断某个words[i]是否可以拆分 再把这个字符加入到字典里面。class Solution { public static Li...原创 2020-03-25 13:40:38 · 194 阅读 · 0 评论 -
动态规划实战11 leetcode-64. Longest String Chain
前言:这道题和阿里3.20笔试第二题有点像,等这类题熟悉后,去增加那道题的DP写法。这道题的思路是这样的(摘自别人的blog)如果想组成链,必须找到一个比当前字符串长度小一的字符串,没有的话,以当前字符为结尾的链长最大只能为1。基于这个思路,我们先建立一个Map lengthMap,用于存储每种长度的字符串有哪些。 接下来,再新建一个Map,用来存储以每个字符串为结尾的最长链的长度。...原创 2020-03-25 09:57:56 · 169 阅读 · 0 评论 -
动态规划实战10 leetcode-64. Minimum Path Sum
确定状态dp[i][j]表示在第i-1行第j-1列最大的path sum值状态转移方程dp[i][j] = dp[i][j] (i=0 and j =0) dp[i][j]+dp[i][j-1] (i=0 and j!=0) dp[i][j]+dp[i-1][j] (i!=0 and j=0) d...原创 2020-03-25 05:55:08 · 120 阅读 · 0 评论 -
动态规划实战8 leetcode-53. Maximum Subarray
确定状态这道题难就在确定状态。因为根据给定的输入,我们可能在中间找到最大值,而不是在最后找到最大值。但是我们可以用一个变量去保存全局的最大值dp[i]表示从下标0至下标i最大的子序列和状态转移方程dp[i] = max(dp[i-1]+nums[i],nums[i])\初始条件和边界条件dp[0] = =nums[0]计算的顺序dp[0] ..... dp[n-...原创 2020-03-24 11:27:06 · 134 阅读 · 0 评论 -
动态规划实战7 leetcode-221. Maximal Square
前言:这道题目我感觉确定状态反而是比较难的一件事确定状态设dp[i][j]代表到i行,j列的最大的正方形边长因为某一个点的最大正方形边长实际上是受他左边的点,上面的点,以及左上角的点影响的。我们知道,该点为右下角的正方形的最大边长,最多比它的上方,左方和左上方为右下角的正方形的边长多1,最好的情况是是它的上方,左方和左上方为右下角的正方形的大小都一样的,这样加上该点就可以构成一个更...原创 2020-03-24 03:27:45 · 132 阅读 · 0 评论 -
动态规划实战6 leetcode-139. Word Break
确定状态最后一步:我们判断从0开始到最后一个字符的整一个字符串是否breakable,检查这个字符串中的substring是否在dict中,并且除掉substring的那一部分是否也可以breakable。dp[i]表示0至i的字符串是否可以word break状态转移方程dp[i] = IsSubstringindict(j,i)&&dp[j] (其中j=i.....原创 2020-03-24 00:21:52 · 148 阅读 · 0 评论 -
动态规划实战4-leetcode 5.Longest Palindromic Substring
确定状态:最长的子串,减去两边的字符也一定是palindromedp[i][j] 代表以i开始,以j结束的字符串是不是palindrome状态转移方程:dp[i][j]=s.charAt(i)==s.charAt(j)&&(j-i+1<3||dp[i+1][j-1]);这种存在性的转移方程有点难写 笔者就直接写程序的表达了初始条件和边界条件没...原创 2020-03-23 13:31:02 · 108 阅读 · 0 评论 -
动态规划实战3-leetcode 55.Jump Game
这道题属于存在性动态规划确定状态:最后一步:如果青蛙能跳到最后一块石头n-1,我们考虑它跳的最后一步,这一步是从石头i跳过来,i<n-1,需要满足两个以下条件:1.青蛙可以跳到石头i2.最后一步不超过跳跃的最大距离:n-1-i<=a[i]设f[j]表示青蛙能不能跳到石头j状态转移方程:初始条件和边界情况f[0]=true计算顺序从左至右 计...原创 2020-03-23 10:52:31 · 149 阅读 · 0 评论 -
动态规划实战2-leetcode 62.unique path
确定状态:最后一步:机器人无论用何种方式到达右下角,总有最后一步的挪动 --向右或者向下假设机器人有x种方式走到(m-2,n-1),有y种方式走到(m-1,n-2)那么机器人有x+y种方式走到(m-1,n-1)为什么?加法原理:无重复、无遗漏dp[i][j]表示机器人走到第i行,第j列转移方程dp[i][j]=dp[i-1][j]+dp[i][j-1]初始条件和边界...原创 2020-03-23 09:35:40 · 160 阅读 · 0 评论 -
动态规划实战1-leetcode 983.Minimum Cost For Tickets
前言:最简单的动态规划比如爬楼梯、斐波那契数列就不做举例分析了。我们来看一下场景相对复杂的题目。确定状态 dp[i]表示到第i天所用的最少的cost状态转移方程(这道题不难写)dp[i]=dp[i-1] 如果在第i天没有traveldp[i]= min {dp[i-1]+costs[0],dp[i-7]+costs[1],dp[i-30]+costs[2]}初始条件和边界条件...原创 2020-03-23 07:18:15 · 154 阅读 · 0 评论 -
小菜找实习-动态规划
前言:最近做了一些国内大厂的笔试,发现国内大厂很喜欢考动态规划。这篇文章记录一下自己对动态规划的学习。计划在26号之前练习二十道左右的DP题,题的来源选择leetcode吧,难度主要在在medium和hard之间。针对几个比较经典的题目,会写具体的文章去分析。动态规划一般解决什么问题?1.计数有多少种方式走到右下角 有多少种方法选出k个数使得和是sum2.求最大最小值从...原创 2020-03-23 05:48:14 · 185 阅读 · 0 评论 -
小菜找实习——阿里3月20日笔试第二题
前言:笔者转专业学生在美国读研一,平时学习算法主要是通过leetcode,公开课,google等方式。这次找实习做国内这些笔试的算法编程题,确实发现和平时写的leetcode不一样。有三点要注意1.要注意输入输出的格式 国内的编程题是纯白板,因此字节跳动是我的第一场笔试,也完全没经验 用了很长时间才弄懂国内的平台是怎么处理输入输出的。2.leetcode上很多算法的实现的容器大多都是...原创 2020-03-22 00:20:51 · 951 阅读 · 0 评论 -
UCBCS188 AI学习笔记(1)uninformed search (无启发函数搜索)
最近有面试笔试都要准备,小菜鸟瑟瑟发抖。等面完了就继续学习写blog。压力就是动力!原创 2020-03-20 01:55:38 · 1009 阅读 · 0 评论 -
插入排序算法
感谢《算法导论》这本书,让我对算法有了新的认识。 插入排序是一个对少量元素进行排序的有效算法。插入排序的工作机理和很多人打牌时,整理手中的牌时差不多。在开始摸牌时,我们的左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将它与手中已有的每一张牌从右到左地进行比较。无论在什么时候,左手中的牌都是原创 2016-10-31 19:04:22 · 339 阅读 · 0 评论 -
算法4中 1.4节示例中运行次数的讲解
问题问的是这个程序有几次操作。 下面的表格给出了次数。本小白再来翻译解释一下。1.第一个是变量的定义 int count 和i 2次2.变量的赋值 count 和i 2次3.在for 循环内判断循环次数 (注意最后一次判断后退出所以要加1) N+1次4.a[i]是否等于0 N次5.访问数组 N次6.count++ (0-N) 与i++(N) N to 2N原创 2017-09-28 17:59:33 · 487 阅读 · 0 评论 -
算法4中数学模型练习题分析
Problem description:How many array accesses does the following code fragment makes as a function of n? (Assume the compiler does not optimize away any array accesses in the innermost loop).以下的原创 2017-10-19 10:57:13 · 502 阅读 · 0 评论 -
Implement queue with two stack 用两个堆实现队列
在上国外某教授的algorithm课,课后有一个小quiz,问题如下 Implement a queue with two stacks so that each queue operations takes a constant amortized number of stack operations.用两个堆实现一个队列,这个队列每次操作的消耗应该是堆操作的分期常量。我们知道队原创 2017-10-24 10:10:34 · 861 阅读 · 0 评论 -
Stack with max and min 查找栈中最大最小数
国外algorithm 课后的一个小quiz:Create a data structure that efficiently supports the stack operations (push and pop) and also a return-the-maximum andareturn-the-minimumoperation. Assume the elements原创 2017-10-24 12:05:20 · 1213 阅读 · 3 评论 -
链表的使用
一.链表的概念 在数组列表的文章中我们已经提到了链表,今天来讲一下链表。 首先再回顾一下链表列表与数组列表的关系。 链表列表:链表是一块不连续的动态空间,长度可变;链表需要按顺序检索节点,效率低;链表的优点是可以快速插入和删除节点,大小动态分配,长度不固定。链表不存在越界问题。数组列表:数组是一块连续的空间,声明时长度就需要固定。数组原创 2016-09-06 11:36:42 · 317 阅读 · 0 评论