数据结构与算法
文章平均质量分 73
主要是通过刷题加深对数据结构和算法的理解。
YuanbaoQiang
非科班自学,正在搭建自己的计算机体系~
展开
-
LeetCode-剑指offer-17-打印从1到最大的n位数(不考虑大数的直接打印、考虑大数的字符串模拟、回溯全排列)
目录题目要求解题过程题目要求原题链接:剑指 Offer 17. 打印从1到最大的n位数输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]说明:用返回一个整数列表来代替打印n 为正整数解题过程不考虑大数直接创建10n−110^n - 110n−1容量的数组 | 时间复杂度:O(10n)O(10^n)O(10n) | 空间复杂度原创 2021-02-08 14:21:55 · 151 阅读 · 0 评论 -
位运算-简单理解n&(n-1)操作
博客内容更新至lc题解:【位运算】简单理解n & (n - 1)操作来源于一道简单面试题:LeetCode-剑指offer-15-二进制中1的个数n随便一个n:n - 1那么n - 1会发生什么:对于上面随便给的一个n,减去1,但是低2位都是0,减1必然需要借位,那何时结束呢?答案就是遇到1的时候。如果第一步骤中给的n末尾为1,那么就直接在低位就结束了,也符合遇到1就停止的规则!总结而言,n - 1操作:1.无论是借位,还是减1,遇到1就停止;2.从低位到高位,一直到1,每一.原创 2021-02-08 11:41:27 · 1703 阅读 · 0 评论 -
LeetCode-剑指offer-14-II-剪绳子(大数取余、动态规划、循环取余、快速幂)
目录题目要求解题过程题目要求原题链接:剑指 Offer 14- II. 剪绳子 II | 343. 整数拆分给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]k[1]…*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:原创 2021-02-07 14:54:00 · 1384 阅读 · 1 评论 -
回溯算法-层次化理解回溯过程
前言二刷LeetCode-剑指offer-12-矩阵中的路径的时候,回想自己曾今做回溯题的时候,简直心里发怵,但是现在我想重拳出击 。每次做回溯题或者递归调用,心里要有一颗树的印象,因为递归的调用,都是从一个点跳跃到另外一个点,这个和树的结构是极其类似的!如果凭空想象,是无法记住那么多调用过程的,就好像现在的人们为什么喜欢用思维导图一样,尤其树状图,可以让自己思维发散的同时不至于迷失。递归调用的时候是发散,而回调返回的时候是收敛。另外要有层次化的意识,在相同的层次即树的深度相同时,可能还会有其他的节原创 2021-02-06 16:28:28 · 914 阅读 · 0 评论 -
三张图简单理解回溯算法
做完简单题LeetCode-剑指offer-06-从头到尾打印链表,画图写博客总结的时候,发现尾递归的操作,如果刚好和正向调用的操作相反的话,其实就是一个简单的回溯过程了。在此记录一下,方便后续思路的延伸~本博客内容也写在lc题解上了:简单理解递归操作 | 顺带理解一下回溯过程~本人偶尔也会会写写题解的OvO,哈哈哈~正向过程:如果执行操作在递归之前,则在每个正向调用的过程中都执行一遍。剑指offer-06-从头打印链表01回调过程:但是,如果执行操作在递归之后,就会在最终的递归出口处开始,继原创 2021-02-04 22:03:40 · 1100 阅读 · 0 评论 -
十大排序算法—这一篇远远不够
十大排序算法—这一篇远远不够目录十大排序算法—这一篇远远不够前言非线性时间比较类排序线性时间非比较类排序十大排序算法复杂度时间复杂度曲线01-冒泡排序算法逻辑算法简图算法性质02-快速排序算法实现算法简图算法性质交换排序类代码实现03-插入排序算法逻辑算法简图算法性质04-希尔排序算法逻辑算法简图算法性质插入排序类代码实现05-选择排序算法逻辑算法简图算法性质06-堆排序算法逻辑算法简图算法性质选择排序类代码实现07-归并排序算法逻辑算法简图算法性质二路归并代码实现08-计数排序算法逻辑算法简图算法性质计原创 2021-01-21 20:37:03 · 335 阅读 · 1 评论 -
老韩数据结构-迷宫问题递归图解(一)
目录人为规定代码实现图解递归人为规定1. map表示地图2. i, j 表示从地图的那个位置开始出发(1,1)(绿色三角形标记)3. 如果小球能到map[6][5]位置(红色三角形标记),则说明通路找到4. 约定:当map[i][j] 为0表示该点没有走过 当为1时表示墙;2 表示通路可以走 3 表示该位置已经走过,但是走不通5. 在走迷宫时,需要确定一个策略(方法) 下-->右-->上-->左,如果该点走不通,则回溯代码实现public class MiGong原创 2020-09-05 22:42:01 · 940 阅读 · 0 评论 -
老韩数据结构-前缀、中缀、后缀表达式(逆波兰表达式)
目录前缀表达式中缀表达式后缀表达式图解转换过程中缀表达式转前缀表达式具体步骤计算方法中缀表达式转后缀表达式具体步骤计算方法代码参考:前缀、中缀、后缀表达式前缀表达式前缀表达式的运算符位于操作数之前对于一个式子1+((2+3)*4)-5,其前缀表达式为:- + 1 * + 2 3 4 5中缀表达式中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,原创 2020-08-30 08:36:14 · 374 阅读 · 0 评论 -
老韩数据结构-栈实现简单计算器运算(图解+代码)
目录基本思路压栈过程图解过程特殊情况处理代码基本思路对于一个字符串运算表达式5+10*6-4定义一个指针从左往右遍历表达式,分别将数字和运算符压入数栈和运算符栈中。最后从数栈和运算符栈中分别pop出元素进行运算压栈过程对于指针所指元素为数字:直接入数栈对于指针所指元素为运算符:如果运算符栈为空,则直接入栈如果运算符栈栈顶运算符优先级小于指针所在运算符,则指针所指运算符直接入栈如果运算符栈栈顶运算符优先级大于指针所在运算符,则从数栈中弹出两个数,从符号栈中弹出一个运算符,进行原创 2020-08-29 21:45:51 · 788 阅读 · 1 评论 -
老韩数据结构-模拟栈压入和弹出(数组、单链表头插法)
目录入栈和出栈参考数组实现单链表(头插法)实现单链表(普通末尾添加顺序)实现入栈和出栈参考二叉树前序-中序-后序遍历(递归、栈结构)以下代码均可直接运行:其中单链表的两种方法,主要在于pop()和push()的方式不太一样,其余都大同小异。同样也可以用双链表实现,和单链表也没差差别,定义Node的时候多加一个Node pre属性即可;数组实现public class ArrayStackDemo { public static void main(String[] args) {原创 2020-08-25 21:33:33 · 263 阅读 · 0 评论 -
老韩数据结构-Josephu问题(单链表实现)
单向链表解法迭代解法见:LeetCode-Josephu问题(圆圈中最后剩下的数字)约瑟夫用单链表解决比较简单,只需要定义两个指针即可,处理方法见deal()方法。除此之外详细的节点定义及构建已给出。public class Josephu2 { public static void main(String[] args) { SLL sll = new SLL(8); // 8个人 sll.construct(); int deal = sll原创 2020-08-25 21:22:30 · 244 阅读 · 0 评论