
数据结构与算法
harrisonlee.net
这个作者很懒,什么都没留下…
展开
-
LeetCode-85
该题首先没有思路,然后看了题解发现与84题有异曲同工之妙。基于栈的方法该题可以通过矩阵构建直方图,对于下图:每一行看成一个直方图,对行中每一个元素求高度,这里的高度指的是当前元素上面一共有多少个连续的1。然后采用第84题中的单调栈的方法。但是需要注意,在每遍历一行后,栈中仍然存放一个元素,该元素是在即将退出循环时被加入的(算是这种实现方式的副产品),所以需要清除掉,否则会导致后面执行异常。 class Solution { public int maximalRectangle(cha原创 2020-11-23 22:26:47 · 294 阅读 · 0 评论 -
LeetCode-84
看了官方的视频后,才得知该题是一道很经典的题目了。官方推荐首先采用暴力解法,然后再优化为单调栈。暴力解法要求矩形的面积,首先要知道长和宽(这道题由于是在直方图中,所以下面称为宽和高),所以有两种办法,第一种是固定宽,然后找高;第二种是固定高,然后找宽。如果采用固定宽,那么会导致O(n3n^3n3)的复杂度。如果采用固定高,会有O(n2n^2n2)的复杂度。官方说通过Java提交暴力解法也可以通过测试,而且暴力解法有助于了解一些细节。具体思路就是,遍历每一个元素,当前元素为高,然后依次往两边遍历,直到两原创 2020-11-23 21:05:51 · 397 阅读 · 0 评论 -
快速排序
快速排序,简称快排,像什么简单插入,冒泡交换,这种面试基本上都是不会问的,但是快排感觉出现的频率有点高。分析首先选择一个基准值,通常为了方便,取第一个元素,然后目的是为了将剩下的元素分成两部分,第一部分都比基准值小,剩下的自然就放在第二部分,然后将基准值放在两部分的中间,分别对左右两部分分别执行上诉操作,直到待排序序列长度为1。快排是不稳定的,假设有两个相等的元素都小于基准值,但是原始序列中较...原创 2019-12-14 12:34:32 · 143 阅读 · 0 评论 -
冒泡排序
分析冒泡排序属于一种交换排序,从第一个元素开始,依次和后面一个元素比较,如果较大,则交换,否则什么都不用做,直接移动到下一个元素即可。比较简单,但请注意,冒泡排序的结束条件是在一轮比较中,没发生过交换。冒泡排序法是稳定的,因为在等于的情况下不发生交换,故相对顺序不会发生变化。复杂度分析对于时间复杂度:最好的情况,就是序列已经有序且和目标排序方向一致,故只会执行n-1次外层循环,记为O(n);...原创 2019-12-14 10:31:10 · 319 阅读 · 0 评论 -
折半插入排序
折半插入排序也属于插入排序的一种,相较于简单插入,对查找插入位置的过程做了改进。分析只说明一下查找插入点的过程,其他都与直接插入一致。分别设置变量 low,high表示有序序列的低位端和高位端下标。每次将low和high的中位值(记为mid)处的元素值与待插入值进行比较。如果较大,则令high=mid-1,否则,则令low=mid+1。 循环这个过程,直到high<low。然后把待插入...原创 2019-12-14 09:52:31 · 238 阅读 · 0 评论 -
直接插入排序
分析插入的思想就是将未排序的数据插入到已经有序的序列中。最开始,有序序列长度为1,取下标为0的元素,即array[0]。从下标1开始,每次插入一个元素到有序序列中,有序序列的长度也将从1增加到n,即整个序列有序。每次插入时,从有序序列的最右端开始比较,直到找到待插入的合适位置。复杂度分析最好的情况是,待排序序列已经有序且和目标序列方向一致(比如下述代码中的从小到大的方向),那么插入操作就会...原创 2019-12-12 21:33:31 · 156 阅读 · 0 评论 -
PAT乙级 1008 数组元素循环右移问题
传送门思路:首先需要移动m个,题目中并没有给出m的数值范围,所以就要与n进行判断,加入m>n,那么就会存在多余的移动,共(m/n圈)。可以使用m=m%n来解决这个问题。把m修正过后,再对数组进行处理。循环左移m个数据时,是把前m个数据倒置,再把后n-m个数据倒置,最后再将整个数组倒置循环右移m个数据时,是把后m个数据倒置,再把前n-m个数据倒置,最后再将整个数组倒置因为m可能为0...原创 2019-04-28 17:35:47 · 145 阅读 · 0 评论 -
1001 A+B Format (20 point(s))
原文链接题意:输入两个整数,可正可负,然后根据题目要求对其和进行格式化。具体格式化要求就是每三位需要用一个 , 隔开.初步思路:先求得两个数的和记为c, 记录c是否为负数, 然后定义一个字符串str, 然后循环对c进行对10取余操作,直到c==0。注意,在循环中需要用一个i记录当前取余到了第几位,便于插入 ‘,’ .代码实现:#include<iostream>#incl...原创 2019-08-04 11:57:31 · 167 阅读 · 0 评论 -
1002 A+B for Polynomials (25 point(s))
原文链接题意模拟输入两个多项式,每次输入两行,每行包含了一个多项式的信息。每一行中,第一个数字是一个非负整数,代表这个多项式的非零项的项数,当然也代表接下来输入多少组项。 每一组项第一个数字是一个非负整数,代表这一项的指数,第二个数字代表该项的系数。输入时,是按照指数的从高到低的顺序输入的。比如对于一个多项式 1.5X5+2.9X2+3.2X0, 输入的内容和格式应该是:3 5 1.5 2 ...原创 2019-08-04 11:56:20 · 238 阅读 · 0 评论 -
1008 Elevator (20 point(s))
原文链接题意:需要从给定的楼层序列中计算电梯运行时间,从背景信息中可以看出,电梯每上升一层楼耗时6s, 开门耗时5s, 下降一层楼耗时4s。注意:电梯一开始在第0层,而且不用计算电梯完成序列后返回的时间。分析:只需遍历输入的序列,当前楼层如果比前一次电梯停靠的楼层高的话就计算上升时间,如果低的话就计算下降时间。因为每到一层都要开门,所以可以把开门时间初始化到结果中。代码:#includ...原创 2019-08-04 11:54:28 · 193 阅读 · 0 评论 -
1011 World Cup Betting (20 point(s))
原文链接题意:输入三组数据,每组数据三个数,第一个数字代表W(赢), T(平局), L(输)。要求求得最大收益,最大收益根据题目中的那个公式进行计算。分析:分别定义三个变量,w, t, l。在定义一个变量保存乘积。循环三次,每次输入这三个数,然后进行比较,然后输出最大数字对应的字母,每次用乘积乘以最大数并赋值给乘积变量。最后根据题目公式输出结果,注意保留两位小数。代码:#include...原创 2019-08-04 11:52:23 · 294 阅读 · 0 评论 -
1015 Reversible Primes (20 point(s))
原文地址题意:每组输入的数中,第一个数是一个十进制的正整数,第二个数是一个个位数,代表基数(也就是说需要先转化为几进制)。分析:本题实际是考察进制的判断和素数的判断,那么可以分进制转换和逆序模块和素数判断两个模块,可以分别写两个函数来实现。代码:#include<iostream>#include<cmath>using namespace std;boo...原创 2019-08-04 11:49:06 · 194 阅读 · 0 评论 -
1019 General Palindromic Number (20 point(s))
题意:输入两个数,N和b,问N的b进制数是否是回文数。分析:该题分为两个问题,如何求任意进制的数和如何判断一个数是否是回文数。显然借助字符串来处理会容易得多。代码:#include<iostream>#include<vector>#include<algorithm>using namespace std;int main(){ i...原创 2019-08-04 11:46:48 · 262 阅读 · 0 评论 -
1020 Tree Traversals (25 point(s))
个人网站链接:https://www.harrisonlee1998.com/blog/detail?id=7题意:根据一棵二叉树的后序遍历和中序遍历来输出层序遍历结果。分析:首先想到的是,先根据后序和中序遍历结果来构造一颗二叉树。如何构造?一棵二叉树(子树也一样)的后序遍历的最后一个节点就是整棵树(子树)的根节点,然后可以利用这一个根节点到中序遍历中去查找,然后左边的即为左子树,右边的即...原创 2019-08-04 11:45:15 · 194 阅读 · 0 评论