
数据结构与算法
文艺的码农青年
这个作者很懒,什么都没留下…
展开
-
每日一道leetcode-最大括号深度
题目描述有效括号字符串 定义:对于每个左括号,都能找到与之对应的右括号,反之亦然。详情参见题末「有效括号字符串」部分。嵌套深度 depth 定义:即有效括号字符串嵌套的层数,depth(A) 表示有效括号字符串 A 的嵌套深度。详情参见题末「嵌套深度」部分。有效括号字符串类型与对应的嵌套深度计算方法如下图所示:给你一个「有效括号字符串」 seq,请你将其分成两个不相交的有效括号字符串,A 和 B,并使这两个字符串的深度最小。不相交:每个 seq[i] 只能分给 A 和 B 二者中的一个,不能既属于转载 2020-12-10 19:53:46 · 1584 阅读 · 0 评论 -
程序员常用十大算法之分治算法
分治算法在计算机科学中,分治法是构建基于多项分支递归的一种很重要的算法范式。字面上的解释是「分而治之」,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序、归并排序)、傅立叶变换(快速傅立叶变换)。分治算法通常以数学归纳法来验证。而它的计算成本则多数以解递归关系式来判定。使用分治算法解决汉诺塔问题...原创 2020-08-04 17:34:08 · 244 阅读 · 0 评论 -
程序员常用十大算法之二分查找算法
1111原创 2020-08-03 16:10:06 · 223 阅读 · 0 评论 -
Java实现赫夫曼树
一、概念给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,这样的二叉树称为最优二叉树,也称为哈夫曼树(HuffmanTree)。赫夫曼树是带权路径最小的树,权值较大的离根节点越近,赫夫曼树图片如下:二、构建赫夫曼树思路分析1)从小到大进行排序,将每一个数据,每一个数据都是一个结点,每个结点可以看成是一颗最简单的二叉树。2)取出根节点权值最小的两颗二叉树3)组成一颗新的二叉树,该树的二叉树的根节点的权值是前面两颗二叉树的根节点的权值。4)再将这颗新的二叉原创 2020-06-21 21:08:56 · 192 阅读 · 0 评论 -
Java实现堆排序
堆堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子:该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是:大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]小顶堆:arr[i] <= arr[2i+1] &&am转载 2020-06-12 23:17:39 · 150 阅读 · 0 评论 -
Java实现斐波那契查找
public class FibonacciSearch {/**@description: 创建最大值刚好>=待查找数组长度的裴波纳契数组@param a: 待查找的数组*/private static int[] makeFiboArray(int[] a){int N = a.length;int first = 1,sec = 1,third=2,fbLength = 2;int high = a[N-1];while (third<N) { // 使得裴波那契数不断转载 2020-05-19 19:54:29 · 188 阅读 · 0 评论 -
Java实现折半查找和插值查找
/** * 折半查找算法(查找的前提是有序数组) * @param arr * @param left * @param right * @param value * @return */ public static int binarySearch(int[] arr,int left,int right,int value) { if (left>right || value<arr[left]原创 2020-05-17 19:04:59 · 147 阅读 · 0 评论 -
Java实现归并排序
public static void mergeSort(int[] arr,int left,int right,int[] temp) { if (left<right) { int mid=(left+right)/2; //向左进行分解 mergeSort(arr,left,mid,temp); //向右进行分解 mergeSort(arr,mid+1,ri.原创 2020-05-08 23:58:28 · 169 阅读 · 0 评论 -
Java实现快速排序
public static void quickSort(int[] arr, int low, int high) { if (low < high) { // 找寻基准数据的正确索引 int index = getIndex(arr, low, high); // 进行迭代对index之前和之后的...转载 2020-04-29 23:30:06 · 151 阅读 · 0 评论 -
Java实现希尔排序(两种方式)
/** * 希尔排序交换法(每次都得进行交换,执行效率比较低) * @param arr */ public static void shellSort(int[] arr) { if (Objects.isNull(arr) || arr.length<=1) { return; } ...原创 2020-04-28 22:49:15 · 196 阅读 · 0 评论 -
Java实现插入排序
/** * 插入排序 * @param arr */ public static void insertSort(int[] arr) { if (Objects.isNull(arr) || arr.length<=0) { return; } for (int i=1;i&l...原创 2020-04-26 23:41:15 · 119 阅读 · 0 评论 -
Java实现选择排序
public static void selectSort(int[] arr) { for (int i=0;i<arr.length-1;i++) { //定义数组第一个值为最小值 int min=arr[i]; //定义最小值的下标 int minIndex=i; ...原创 2020-04-22 22:58:55 · 155 阅读 · 0 评论 -
Java实现冒泡排序
package com.dmj.admincommon.util;import java.util.Arrays;public class BubbleSort { public static void bubbleSort(int[] arr) { //数据只有一个大小的话不用进行排序 if (arr.length<=1) { ...原创 2020-04-20 23:10:23 · 138 阅读 · 0 评论 -
Java链表实现栈
用链表实现栈一、算法的思想用链表实现栈的先进后出,实现栈的push,pop,peak方法。主要就是利用链表的头结点作为栈顶的元素。1.当要push的时候,相当于新new一个头结点,然后让新节点指向单链表的头结点。以新节点作为单链表的头节点即可。2.当要pop的时候,只要将链表的头指针后移到它的next,将next作为新的头结点即可3.当要peak的时候,只要返回头结点的值就好了。二...转载 2020-03-27 12:23:40 · 377 阅读 · 0 评论