
数据结构与算法设计
数据结构与算法设计包括对表,栈,队列,树,图等抽象数据类型进行操作以及更深层次的算法设计解读
KevinBrain
热爱编程!热爱生活!代码改变世界!一枚喜欢研究各种代码技术,对计算机技术充满好奇心的技术宅。
展开
-
力扣题解-数学题类|你可以获得的最大硬币数目
1561. 你可以获得的最大硬币数目2020深信服笔试原题有 3n 堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币:每一轮中,你将会选出 任意 3 堆硬币(不一定连续)。Alice 将会取走硬币数量最多的那一堆。你将会取走硬币数量第二多的那一堆。Bob 将会取走最后一堆。重复这个过程,直到没有更多硬币。给你一个整数数组 piles ,其中 piles[i] 是第 i 堆中硬币的数目。返回你可以获得的最大硬币数目。示例 1:输入:piles = [2,4,1,2,7,8]输出:9原创 2020-10-11 21:26:06 · 674 阅读 · 0 评论 -
力扣题解-字符串类|字符串转换(编辑)距离
72. 编辑距离给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例 1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')示例 2:输入:word1 = "i原创 2020-10-11 21:22:24 · 759 阅读 · 0 评论 -
力扣题解-数学题类| 手动实现求平方根sqrt()方法
实现 int sqrt(int x) 函数。2020深信服笔试原题计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。理论基础:牛顿迭代法 牛顿迭代法顾名思义当然是迭代法的一种,所谓迭代法顾名思义就是重复地进行某种运算。进行到何时为止全凭个人喜好,但是理想情况下应该是计原创 2020-10-11 20:38:26 · 619 阅读 · 0 评论 -
力扣题解-二叉树类| 二叉树求高度、深度、宽度、判断平衡性等系列问题(java实现)
1、求树的深度(最大深度)树的深度是从根节点到最远叶子节点的最短路径上的节点数量//(递归方式)获取以root为根节点的子树的深度:从叶子节点到达根节点的最长路径public int getDept(TreeNode root, int dept){ if(root == null){ return dept; } int leftDept = getDept(root.left, dept+1); int rightDept = getDept(ro原创 2020-08-21 16:15:41 · 600 阅读 · 0 评论 -
力扣题解-动态规划类| 三种背包问题题解(java实现)
一、 01背包问题描述:给定 N 件物品,物品的重量为 w[i],物品的价值为 c[i]。现挑选物品放入背包中,假定背包能承受的最大重量为 V,问应该如何选择装入背包中的物品,使得装入背包中物品的总价值最大?输入:4 102 13 34 57 9输出:12思路:手推dp表如下:import java.util.Scanner;public class Main{ public static void main(String[] args){ Scanner scanner原创 2020-08-20 17:07:18 · 1410 阅读 · 1 评论 -
排序五| 归并排序和基数排序
归并排序归并排序是另一类不同的排序方法,这种方法是运用分治法解决问题的典型范例。 归并排序的基本思想是基于合并操作,即合并两个已经有序的序列是容易的,不论这两个序列是顺序存储还是链式存储,合并操作都可以在 Ο(m+n)时间内完成(假设两个有序表的长度分别为 m 和 n)。为此,由分治法的一般设计步骤得到归并排序的过程为:划分:将待排序的序列划分为大小相等(或大致相等)的两个子序列;治理:当子序列的规模大于 1 时,递归排序子序列,如果子序列规模为 1 则成为有序序列;组合:将两个有序的子序列合并原创 2020-07-20 14:59:48 · 712 阅读 · 0 评论 -
排序四| 选择类排序(java实现)
选择排序的基本思想是:每一趟从 n-i+1 (i=1,2,…,n)个元素中选取一个关键字最小的元素作为有序序列中第 i 个元素。本节在介绍简单选择排序的基础上,给出了对其进行改进的算法——树型选择排序和堆排序。原创 2020-07-17 16:18:34 · 980 阅读 · 0 评论 -
排序三| 交换类排序(java实现)
交换类排序主要是通过两两比较待排元素的关键字,若发现与排序要求相逆,则“交换”之。在这类排序方法中最常见的是起泡排序和快速排序,其中快速排序是一种在实际应用中具有很好表现的算法。起泡排序(冒泡排序)起泡排序的思想:首先,将 n 个元素中的第一个和第二个进行比较,如果两个元素的位置为逆序,则交换两个元素的位置;进而比较第二个和第三个元素关键字,如此类推,直到比较第 n-1 个元素和第 n 个元素为止;上述过程描述了起泡排序的第一趟排序过程,在第一趟排序过程中,我们将关键字最大的元素通过交换操作放到了具原创 2020-07-16 15:39:47 · 298 阅读 · 0 评论 -
排序二| 插入类排序(java实现)
插入排序的基本排序思想是:逐个考察每个待排序元素,将每一个新元素插入到前面已经排好序的序列中适当的位置上,使得新序列仍然是一个有序序列。在这一类排序中主要介绍三种排序方法:直接插入排序、折半插入排序(二分插入排序)和希尔排序。直接插入排序直接插入排序是一种最简单的插入排序方法,它的基本思想是:仅有一个元素的序列总是有序的,因此,对 n 个记录的序列,可从第二个元素开始直到第 n 个元素,逐个向有序序列中执行插入操作,从而得到 n 个元素按关键字有序的序列。一般来说,在含有 j-1 个元素的有序序原创 2020-07-15 15:40:41 · 357 阅读 · 0 评论 -
排序一| 排序的概念、分类、性能分析(复杂度)
排序排序(sorting)的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。其确切的定义为:假设有n个数据元素的序列{R1 , R2 , … , Rn},其相应关键字的序列是{K1 , K2 , … , Kn},通过排序要求找出下标 1 , 2 , … , n的一种排列p1 , p2 , … , pn,使得相应关键字满足如下的非递减(或非递增)关系 Kp1 ≤ Kp2 ≤ … ≤ Kpn 这样,就得到一个按关键字有序的纪录序列:{ Rp1 , Rp2 , … , Rpn }。数据元原创 2020-07-14 17:33:31 · 496 阅读 · 0 评论 -
二叉树(四)| 平衡二叉树AVL(java实现)
平衡二叉树AVL在二叉查找树中进行查找,结点的插入和删除等操作的时间复杂度都是 Ο(h),其中 h 为查找树的高度。可见,二叉查找树高度直接影响到操作实现的性能,而在某些特殊的情况下二叉查找树会退化为一个单链表,如插入的结点序列本身就有序的情况下,此时各操作的效率会下降到 Ο(n),其中 n 为树的规模。因此,在结点规模固定的前提下,二叉查找树的高度越低越好,从树的形态来看,也就是使树尽可能平衡。当二叉查找树的高度为 Ο(log n)时,此时各算法的时间复杂度均为 Ο(h)=Ο(log n);另一方面由原创 2020-07-13 15:38:22 · 325 阅读 · 0 评论 -
二叉树(四)| 线索化二叉树(java实现)
线索化二叉树在有n个结点的二叉链表中,每个结点有指向左右2个孩子的指针域,所以有2n个指针域,而n个结点的二叉树一共有n-1条分支线(根节点没有),也就是说,其实存在2n-(n-1) = n+1 个空指针域。空间十分浪费。在另一方面,我们对二叉树做中序遍历时,我只知道每个树结点的左右孩子是谁,却不知道该树结点的前驱和后继是谁。要想知道必须重新遍历一遍。考虑在创建时就记住这些前驱和后继,那将会省去很多时间。如果树结点左右孩子都不为NULL ,如果采用中序遍历,那么该结点的前驱结点是不是左孩子,后继结点原创 2020-07-13 15:10:39 · 305 阅读 · 0 评论 -
二叉树(三)| 二叉树的高级操作(求高度、深度)(java实现)
二叉树节点的存储结构 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }获取树的深度树的深度是指从根节点到叶子节点的最长路径。当前节点的深度示意图1、递归实现获取树的深度 //(递归方式)获取以root为根节点的子树的深度:从叶子节点到达根节点的最长路径 public int原创 2020-07-10 10:23:46 · 1865 阅读 · 0 评论 -
二叉树(二)| 二叉树的四种遍历(java实现)
二叉树节点的存储结构 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }先序遍历先序遍历的顺序为: 根 -> 左 -> 右。1、递归方法很容易实现: //(递归)先序遍历 根 > 左>右 public void preOrderTraveral(TreeNode no原创 2020-07-09 11:19:00 · 234 阅读 · 0 评论 -
二叉树(一)| 二叉树的基本操作(增删改查)解析(java实现)
二叉树节点的存储结构首先定义二叉树结构的节点存储结构: public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }插入节点过程分析:每次插入节点需要明确知道被插入的父节点以及被插入节点的位置(左右)。 如果为空树,则直接当前节点作为根节点。 如果不为空树: 如果新节点值比当前节点值大,则往...原创 2020-07-08 16:54:15 · 727 阅读 · 1 评论