
算法设计与分析
文章平均质量分 91
一只小林同学
这个作者很懒,什么都没留下…
展开
-
平衡二叉树——AVL树(Java实现)
平衡二叉树——AVL树文章目录平衡二叉树——AVL树1、二叉搜索树的缺点2、AVL树的性质3、为何能保持平衡3.1、判断失衡的方式——平衡因子3.2、四种失衡的情况3.3、解决失衡的方法——旋转3.4、四种情况对应的旋转方式4、平衡二叉树实现4.1、节点结构4.2、AVL树完整代码4.3、测试1、二叉搜索树的缺点平衡二叉树是二叉搜索树的改进版,二叉搜索树用来快速的对数据进行查找,可以将原先O(n)的复杂度降低到O(logn),但这是在理想情况下的结果,若在原序列是有序的情况下,构建出的二叉搜索树就是线原创 2020-10-22 19:51:05 · 498 阅读 · 3 评论 -
LeetCode打卡——33.搜索旋转数组排序
LeetCode打卡——33.搜索旋转数组排序题目描述假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0输出: 4示例 2:输入: num原创 2020-07-30 16:44:33 · 158 阅读 · 2 评论 -
LeetCode打卡——200.岛屿数量
LeetCode打卡——200.岛屿数量题目描述给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:[['1','1','1','1','0'],['1','1','0','1','0'],['1','1','0','0','0'],['0','0','0','0','0']]输出: 1示例原创 2020-07-30 15:57:12 · 186 阅读 · 1 评论 -
LeetCode打卡——62.不同路径
LeetCode打卡——62.不同路径题目描述一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向右 -> 向下2. 向右 -> 向下 -> 向右3. 向下 -> 向右 -原创 2020-07-30 15:44:44 · 908 阅读 · 0 评论 -
LeetCode打卡——322.零钱兑换JAVA
LeetCode打卡——322.零钱兑换题目描述:给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。示例:示例 1:输入: coins = [1, 2, 5], amount = 11输出: 3 解释: 11 = 5 + 5 + 1示例 2:输入: coins = [2], amount = 3输出: -1思路:涉及到选与不选的问题,很明显可以用动态规划来解,我们可以原创 2020-07-25 12:40:09 · 243 阅读 · 1 评论 -
0-1背包变体——双机调度
0-1背包变体——双击调度问题描述双机调度问题:有n项任务, 任务i 的加工时间为ti , i=1,2,…,n. 用两台相同的机器加工,从0时刻开始计时,完成时间是后停止加工机器的停机时间. 问如何把这些任务分配到两台机器上,使得完成时间达到最小?设给定实例如下:t1=1,t2=5,t3=2,t4=10,t5=3,给出一个加工时间最少的调度方案。解决思路算法描述算法:DMschedule输入:任务数量n、所有任务耗时序列work[n]①初始化totalTime=0②for i=0 to原创 2020-05-10 21:40:34 · 1918 阅读 · 1 评论 -
动态规划——最长公共子序列
动态规划——最长公共子序列设计与实现最长公共子序列问题的算法;解决思路首先需要明确子序列的概念,子序列与子串并不是一种东西,子序列我们可以理解为在一个序列中删除任意多个字符,剩余字符按原有顺序组成的序列就是原序列的子序列,其中删除的字符可以使连续的也可以是不连续的,对于任意一个字符来说,有删除与不删除两种选择,那么对于一个长为n的序列,他就有2^n个子序列。我们想求两个序列的最长公共子序列,最简单的方法就是生成一个序列的所有子序列,然后检查这些子序列是否是另一个序列的子序列,并找到最长的公共子序列。原创 2020-05-10 21:36:37 · 366 阅读 · 0 评论 -
动态规划——0-1背包问题
动态规划——0-1背包问题问题描述设计与实现求解0-1背包问题的动态规划算法;0-1背包问题:给定n个重量为w1,w2,w3…wn,价值为v1,v2,v3…vn的物品和容量为C的背包,求这个物品中一个最有价值的子集,使得在满足背包的容量的前提下,包内的总价值最大解决思路算法表述算法knapsack_dy输入:物品重量表weight[n]、物品价值表value[n]、物品个数n、背包容量n输出:最大价值①for i=0 to limit do② if weight[0] &l原创 2020-05-10 21:28:11 · 1052 阅读 · 0 评论 -
动态规划——矩阵链乘法
动态规划——矩阵链乘法设 A1, A2 , … , An 为矩阵序列,Ai 为 Pi-1 Pi 阶矩阵,i = 1, 2, … , n. 试确定矩阵的乘法顺序,使得元素相乘的总次数最少.*解决思路算法描述①初始化数组m[i][j]为0②for r=2 to n do③ for i=1 to n-r+1 do④ j=i+r-1⑤ m[i][j]=m[i+1][j]+ P_(i-1)P_iP_j⑥ s[i][j]=i⑦ for原创 2020-05-10 21:15:32 · 418 阅读 · 0 评论 -
分治算法——最邻近点对
分治算法——最邻近点对设计与实现查找平面上的最邻近点对问题的算法。解决思路如果说用暴力的方法来解决这道题,我们需要将所有的点两两进行比较,两层循环的时间复杂度为O(n),那么如何降低时间复杂度呢?如果空间中只存在一个点,那么就不存在最近点对,如果空间中只有两个点时,最近点对就是这两个点,那么当空间中有三个点时,我们便可以将空间划分为两个部分,左半部分有两个点,右半部分有一个点,那么我们就可以将问题划分为求左半部分,右半部分以及交界处的最近点对的最小值。可是当点越来越多的时候,我们应该如何求得两个子控件原创 2020-05-10 20:41:26 · 2794 阅读 · 2 评论 -
分治算法——求逆序对数
分治求逆序对数问题描述在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他对各种不同信息的兴趣,从而实现个性化服务。对于不同的排名结果可以用逆序来评价他们之间的差异。考虑1,2,……,n的排列i1,i2,……in,如果其中存在ij,ik使得j<k但是i1>ik,那么就称ij,ik是这个排列的一个逆序。一个排列含有逆序的个数称为这个排列的逆序数。设计和实现统计逆序的分治算法,并对算法进行时间复杂度分析。解决思路寻找数组中的逆序对数,暴力的做法就是原创 2020-05-10 20:32:16 · 2734 阅读 · 0 评论 -
查找中位数(分治策略)
问题描述设计与实现查找数组的中项问题的算法;解决思路 要找出一个数组的中位数,最简单的方法当然是将数组排序,但快速排序的时间复杂度也需要O(nlogn),我们可以寻找更快的算法来解决。首先对于一个长度为n的有序数组a[n],若n为偶数,则中位数为(a[n/2]+a[n/2-1])/2,若n为奇数,则中位数为a[n/2],那么问题的关键就是找到a[n/2]和a[n/2-1],然而这是在...原创 2020-03-30 17:30:48 · 12829 阅读 · 2 评论 -
重新排列数组的数,使得负数都排在正数的前面
@重新排列数组的数,使得负数都排在正数的前面问题描述 设A是由n个非0实数构成的数组,设计一个算法重新排列数组的数, 使得负数都排在正数的前面。要求算法使用O(n)的时间和O(1)的空间解决思路 对于这样一个问题,我们最容易想到的思路是对数组进行排序,然后就得到了目标数组,然而题目中还对时间复杂度与空间复杂度进行了限制,即使是快速排序,时间复杂度最优也要O(nlogn),而空间复杂...原创 2020-03-30 16:46:35 · 6836 阅读 · 6 评论