数据结构与算法
三七有脾气
我是“三七有脾气”,一个在互联网“苟且偷生”的程序员
展开
-
一个算法笨蛋的3月leetCode刷题日记
类似文章一个算法笨蛋的2021年11月leetCode刷题日记一个算法笨蛋的2021年12月leetCode刷题日记一个算法笨蛋的2022年1月leetCode刷题日记一个算法笨蛋的2022年2月leetCode刷题日记一个算法笨蛋的2022年3月leetCode刷题日记...原创 2022-03-02 14:33:08 · 431 阅读 · 0 评论 -
使用Java刷动态规划问题的经验总结
1、基调动态规划很难,不像排序算法或者查找算法,只需要记住固定的代码,就可以使用在任何需要该算法的地方,动态规划只有套路,或者说框架,可能你做了几百道动态规划的题,思路一时间没转过弯来,leetcode中medium级别的题都做不出来。2、术语解释动态规划有最优子结构、重叠子问题、状态转移方程、dp数组、base case、状态等术语。看起来高深莫测,其实都是一些容易理解的东西,这里我就解释一下我感觉需要了解的术语:状态什么是状态,状态就是变量,与所求的结果密切相关的变量。比如背包问题,要求背原创 2022-02-16 16:02:26 · 501 阅读 · 2 评论 -
一个算法笨蛋的2月leetCode刷题日记
时间情况2022年2月7日【474】一和零(思路:同样是动态规划中的0-1背包问题,我想到要用三维数组,但是想不到状态转移方程,脑子里还想着要给这个三维数组进行初始化,发现不现实,然后就gg了。看题解确实是用三维dp数组,方法同样巧妙,dp[i][j][k]代表的是前面k个字符串,有j个0,k个1,值为子集的长度。在一重循环中获取当前字符串的0的个数zeros和1的个数ones,在三重循环中进行判断选择放入背包或者不放入,不放入就是dp[i][j][k] = dp[i-1][j][k]...原创 2022-02-07 15:00:32 · 691 阅读 · 0 评论 -
一篇文章解释清楚leetcode经典动态规划问题:72.编辑距离
吐槽题意简单,但是它就是难,让人摸不着头脑,手足无措的难。思考一下由于是求最值,第一反应就是往动态规划方向想,但是就算是套用动态规划的思路框架:1、思考如何使用数组来表达状态,即dp table2、思考如何写出状态转移方程3、思考如何定义初始数据,即base case4、思考如何优化执行效率大部分人就会发现,连第一步都想不出来;增、删、替换这些个操作,如何体现为数组的操作。更不用说写出状态转移方程了。既然直接写出动态规划的写法太难了,那我们就换个思路,先根据下面的思路,层层推导试试:.原创 2022-01-24 10:36:28 · 475 阅读 · 0 评论 -
一个算法笨蛋的11月leetCode刷题日记
时间情况2021年10月29日时隔一年,第三次重做反转链表,又没做出来,太废了2021年11月1日时隔两天,第四次重做反转链表,轻松写出2021年11月2日原创 2021-11-01 14:54:26 · 379 阅读 · 1 评论 -
java排序算法之插入排序
排序算法之插入排序插入排序:1.插入排序的复杂度是O(n^2),四大基础排序算法之一,八大基本排序算法之一2.插入排序的原理:插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。刚开始这个小序列只包含第一个元素,事件复杂度O(n2)。比较是从这个小序列的末尾开始的。想要插入的元素和小序列的最大者开始比起,如果比它大则直接插在其后面,否则一直往前找它该插入的位置。如果遇见了一个和插入元素相等的,则把插入元素放在这个相等元素的后面。所以相等元素间的顺序没有改变,是稳定的。3.代码实现:pa原创 2021-06-30 12:48:05 · 199 阅读 · 0 评论 -
数据结构之复杂度计算
数据结构之复杂度计算1.时间复杂度举个例子来说:数学家高斯小时候的事,计算1+2+。。。+100的和,有两种方法,为第一种:for(int i=0;i<=100;i++){sum=sum+i;}第二种:int n=100 sum=0;sum=(n+1)*n/2;无疑第一种需要计算100次,复杂第二种需要计算1次即可,简单。两种时间复杂度分别为O(1),O(n),括号内的常量只能为1,其他都是n,及n的指数,如O(n^2) , O(n^100)等等。。。例如for(int原创 2021-06-26 15:16:08 · 1096 阅读 · 0 评论 -
java实现单链表的创建,查询与显示(按id显示)
数据结构之单链表的创建,查询与显示(按id显示)package cn.ycl.dataStructures;public class singleListdemo {public static void main(String[] args) {singleList list = new singleList();heroNode hero1 = new heroNode("张三", 1, "大哥");heroNode hero2 = new heroNode("李四", 2, "二哥");原创 2021-06-26 15:14:51 · 386 阅读 · 0 评论 -
排序算法之选择排序
排序算法之选择排序选择排序,呵呵,不咋用得到,复杂度也挺高的,更冒泡,选择排序一样,都是n^2思路解释:第一遍在arr[1]arr[maxsize-1]找出最小的值,与arr[0]比较并判断是否交换;第二遍,在arr[2]arr[maxsize-1]找出最小值,与arr[1]比较并判断是否交换,以此类推…package cn.ycl.dataStructures.sort;import java.util.Arrays;public class selectSort {int[] arr原创 2021-06-26 15:14:07 · 108 阅读 · 0 评论 -
java排序算法之希尔排序
排序算法之希尔排序其实希尔排序的本质就是插入排序,不过希尔排序更加高效,也可以称为缩小增量排序希尔排序实现代码:package cn.ycl.dataStructures.sort;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date;public class shellSort {public static void main(String[] args) {// TODO原创 2021-06-26 15:08:35 · 155 阅读 · 0 评论 -
java排序算法之归并排序
排序算法之归并排序归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。两个图,解释如何归并先分再合:package cn.ycl.dataStructures.sort;import java.util.Arrays;public class mergeSort { p原创 2021-06-26 15:05:41 · 323 阅读 · 0 评论 -
java合并两个有序的单链表,合并之后的链表依然有序
合并两个有序的单链表,合并之后的链表依然有序来源:https://blog.csdn.net/ytc958374686/article/details/103402268合并两个有序的单链表,合并之后的链表依然有序原文链接:https://blog.csdn.net/ytc958374686/article/details/103402268 思路:新建一个单链表,每次都把两个有序链表中的更小的值加入到新链表中public class LinkedListConbine { publ转载 2021-06-22 17:38:27 · 528 阅读 · 0 评论 -
java数据结构之逆波兰计算器完整版
数据结构之逆波兰计算器完整版package cn.ycl.reversepolishcal;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.Stack;import java.util.regex.Pattern;public class ReversePolishMultiCalc {/*** 匹配 + - * / ( ) 运算符*/stati原创 2021-06-22 17:36:57 · 117 阅读 · 0 评论 -
java利用回溯算法解决八皇后问题
数据结构之八皇后package cn.ycl.dataStructures.recursion;//递归-八皇后问题(回溯算法)/** * 八皇后问题算法思路分析 1)第一个皇后先放第一行第一列 * 2)第二个皇后放在第二行第一列,然后判断是否OK,如果不OK,继续放在第二列,第三列,依次把所有列放完,找到一个合适的 * 3)继续第三个皇后,还是第一列,第二列,第三列。。。。直达第八个皇后也能放在一个不冲突的位置,算是找到一个正确解 * 4)当得到一个正确解时,在栈回退到上一个栈时,就会开始原创 2021-06-22 17:36:06 · 315 阅读 · 0 评论 -
中缀表达式转后缀表达式的文字表述
中缀表达式转后缀表达式的文字表述初始化两个栈:运算符栈 s1 和储存中间结果的栈 s2;从左至右扫描中缀表达式;遇到操作数时,将其压 s2;遇到运算符时,比较其与 s1 栈顶运算符的优先级:1.如果 s1 为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;2.否则,若优先级比栈顶运算符的高,也将运算符压入 s1;3.否则,将 s1 栈顶的运算符弹出并压入到 s2 中,再次转到(4-1)与 s1 中新的栈顶运算符相比较;遇到括号时:(1) 如果是左括号“(”,则直接压入 s1(2)原创 2020-11-26 10:24:32 · 166 阅读 · 1 评论 -
java排序算法之快速排序,两者方法,并测试速度
排序算法之快速排序快速排序的原理就是思路分析:快速排序采用双向查找的策略,每一趟选择当前所有子序列中的一个关键字作为枢纽轴,将子序列中比枢纽轴小的前移,比枢纽轴大的后移,当本趟所有子序列都被枢轴按上述规则划分完毕后将会得到新的一组更短的子序列,他们将成为下趟划分的初始序列集。时间复杂度:最好情况(待排序列接近无序)时间复杂度为O(nlog2n),最坏情况(待排序列接近有序)时间复杂度为O(n2),平均时间复杂度为O(nlog2n)。package cn.ycl.sort;import java原创 2020-08-13 08:52:56 · 341 阅读 · 0 评论 -
java之基数排序及速度
排序算法之基数排序基数排序基本思想:1)将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。2)基数排序的排序次数取决于排序数据中,最大的那个数的位数,如最大的那个数是1234,是四位数,就需要排序四次,第一次按照个位排,第二次按照十位排。。。。所以一共需要10个桶,用于装每一个位数的0~9这10种可能3)图解排十位数排百位数所以呢,基数排序其实也是桶排序的一种扩展代码:原创 2020-08-12 08:47:01 · 229 阅读 · 0 评论 -
java排序算法之冒泡排序
排序算法之冒泡排序、//所谓冒泡排序,其原理就是依次将第一个数与后一个数比较,数字大的就后移,第一次排序后,最后一个数字就是最大的树,然后再依次将第二个数与后一个数比较,数字大的后裔,第二次排序后,倒数第二个数字就是第二大的数了,后面逻辑一样。package cn.ycl.dataStructures.sort;import java.util.Arrays;//冒泡排序public class BubbleSort { public static void main(String[] a原创 2020-08-11 08:26:22 · 197 阅读 · 0 评论 -
java查找算法之顺序查找
查找算法之顺序查找顺序查找太简单了,写在博客似乎降低档次,但是,查找算法一家人就得要整整齐齐。package cn.ycl.dataStructures.Search;public class SeqSearch { public static void main(String[] args) { int arr[] = { -1, 6, 9, 3, 90, 56, 2 };int seqSearch = seqSearch(arr, 90);System.out.println(seq原创 2020-08-11 08:24:29 · 220 阅读 · 0 评论 -
查找算法之插值查找
查找算法之插值查找1) 插值查找原理介绍:插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找2)他与二分查找的最大区别就是这个mid的定义,使得在基本连续的有序数据中,插值查找会比二分查找优秀。int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);public class InsertValueSearch { public static void main(原创 2020-08-10 09:07:08 · 169 阅读 · 0 评论 -
java数据结构之哈希表
数据结构之哈希表啥是哈希表?散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。如果没有实际接触过哈希表的实例,及代码,看概念是真的难以理解,下面来看实例哈希表(散列)-Google 上机题看一个实际需求,google 公司的一个上机题:有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址原创 2020-08-09 08:13:04 · 193 阅读 · 0 评论 -
Java实现数据结构之哈夫曼树
数据结构之哈夫曼树在写代码前,我们先要了解一下什么是哈夫曼树基本介绍1) 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。2) 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近赫夫曼树几个重要概念和举例说明1) 路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层原创 2020-08-07 09:05:23 · 447 阅读 · 0 评论 -
java查找算法之二分查找
查找算法之二分查找二分查找,一个既简单,又实用,又容易被所有面试官问到的问题,可以可以以下分为查找一个值和查找多个相同 的值package cn.ycl.dataStructures.Search;public class BinarySearch { public static void main(String[] args) { // TODO Auto-generated method stub int arr[] = { 1, 4, 7, 9, 12, 90, 98 };原创 2020-08-06 08:13:06 · 121 阅读 · 0 评论 -
数据结构之二叉树的前、中、后序遍历代码初试
数据结构之二叉树的前、中、后序遍历代码初试package cn.ycl.dataStructures.BinaryTree;public class BinaryTreeDemo { public static void main(String[] args) { //先手动创建一颗二叉树 , 以后用递归创建 BinaryTree binaryTree = new BinaryTree(); heroNode root=new heroNode( 1 , "宋江" ); heroNod原创 2020-08-05 09:13:03 · 274 阅读 · 1 评论 -
数组、链表、树作为存储方式的优点和缺点
数据结构之二叉树初步了解为什么有了数组存储方式和链式存储方式后,还需要树存储方式?①数组存储方式优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低②链式存储方式优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历③树存储方式能提高数据存储,读取的效率,原创 2020-08-04 19:45:52 · 1202 阅读 · 0 评论 -
java实现前序,中序,后序遍历+图解
数据结构之二叉树前序,中序,后序遍历图解先来个图,方便理解如果是前序遍历,那么,遍历结果就是:1,2,4,5,3,6,7如果是中序遍历,那么,遍历结果就是:4,2,5,1,6,3,7如果是后序遍历,那么,遍历结果就是:4,5,2,6,7,3,1嗯,这个结果不仅是我推算出来的,还是经过程序验证滴,如图验证代码如下,额,其实还用了顺序存储二叉树的知识,这篇博客是我后面补充的package cn.ycl.dataStructures.BinaryTree;public class ArrBina原创 2020-08-04 19:43:41 · 1264 阅读 · 0 评论 -
java实现堆排序
排序算法之堆排序现在是2020年3月3日上午9点,看了好久好久的堆排序还是无法理解其运算到底是如何排序的,很不甘,但是就是听不懂,好吧,我会回来的,先照着代码先打一遍,理解了一半堆排序百度百科(废话)堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度原创 2020-08-04 19:40:15 · 194 阅读 · 1 评论 -
Java实现哈夫曼编码--数据无损压缩
数据结构之哈夫曼编码—数据无损压缩哈夫曼编码可以可以将数据无损压缩,很强大,那么我们来了解一下哈夫曼编码: 首先,哈夫曼编码的原理是利用了哈夫曼树,通过统计数据中字符出现的次数,让出现最多的字符离哈夫曼树的根结点就越近,其路径也就越近,路径就是有1和0表示,如数据:"i like like like java do you like a java"中,出现的最多的是空格,我们通过哈夫曼树,就可以将其路径变得最短,如本来可能是1001001,使用哈夫曼树后就可能变成110了, 说到这里大家可原创 2020-08-03 08:55:09 · 862 阅读 · 0 评论 -
递归和非递归的方式写二分查找有什么区别
递归和非递归的方式写二分查找有什么区别前言:结论就是非递归比递归好用,既节省电脑的资源,写起来也方便递归:递归的二分查找方法,会调用一系列函数,并且会涉及到返回中的参数传递和返回值的额外开销,在一些嵌套层数深的算法中,递归会力不从心,空间上会以内存崩溃而告终。但是递归也是有优势的,递归的代码的可读性强,程序员也容易进行编程。非递归非递归的二分查找一般就需要使用循环了,循环一般情况下会难以理解,而且要编写出循环实现功能也更加困难,不利于代码的可读性和代码的编写。但是循环的效率高,执行次数只会根原创 2020-08-03 08:47:06 · 1180 阅读 · 0 评论