随笔分类 - 数据结构与算法
摘要:一道简单题,重点在于进位的处理。 有意思的地方是,进位的动作非常适合使用递归描述,一位一位的处理,并由上一位的计算结果决定该位的处理方式。 定义递归的坐标:flag:当前处理的位数;isCarry:上一位计算是否进位 public final int[] plusOne(int[] digits)
阅读全文
摘要:上题目: 解空间明确,一个从 nums[0] 开始辐射出去的树状解空间。首先暴力搜索一下,暴力搜索解法: public final boolean canJump(int[] nums) { if(nums==null){return false;} int length=nums.length;
阅读全文
摘要:一个经典的问题,判断某个整数是否为回文数。 问题很简单,练手题。 递归表示,如果某个字符与其回文字符不同,则不是回文数;如果相同,则继续判断其子串是否为回文数: public final boolean isPalindrome(int x) { if(x<0){return false;} if(
阅读全文
摘要:链表实现: /** * @Author Nxy * @Date 2019/12/4 * @Param * @Return * @Exception * @Description 链表并归排序 * 递归分解序列为两个子序列,并向上并归排序,返回排序后的总链表 * 使用快慢指针法,快指针到终点时慢指针指
阅读全文
摘要:上一篇博客写了分治解法以及为什么要用分治。 分治通过我们对子问题的定义,实例化了我们每一步计算的语义,从而帮助我们找到解空间中的重复结构。 在进行分治时,我们找到了分割问题,并用子问题的解表示问题解的方式,也就是状态转移方程: 整个分治的计算过程分为两个阶段,向下分割问题,向上汇聚子问题的解从而得到
阅读全文
摘要:上一篇博客贴了该题的暴力递归解法,这次贴一下分治解法。 分治法是不断的将问题分解,直到分解到最小子问题,然后不断的向上返回,由小问题的解表示大问题的解。 首先需要了解的是,分治不等于二分,二分法是分治的一个特例。二分法可以直接在每次计算时,将问题规模减半。而普通的分治并没有缩小总的问题规模,只是将问
阅读全文
摘要:首先声明的是这种解法非常非常的原始和不优雅,甚至比暴力递推还要臭长。 对于最长回文子串这种经典的老题目,有很多亮眼的解法,比如与逆序串取交集。 但我们解决问题不能总是依靠这种眼前一亮(虽然很少亮那么一下),我们应该有一些通用的思考方法,可以用来解决绝大部分问题。 问题的解决都有递归和递推的两种描述,
阅读全文
摘要:因为感觉对 B 树的理解不是特别深刻,一直想手撸一个 B 树,这次终于得偿所愿,文末有完整的 B 树代码。 代码比较长,大概六百行。 B 树的代码使用了一百组数据进行 插入/删除 测试,结果正确。 从生产讲,实现一棵 B 树不会有什么实际意义,但是这些代码和构建这些代码的思路,都将成为我们职业素养的
阅读全文
摘要:KMP算法是目前应用非常广泛的一种字符串匹配算法,因为其代码量比较少,相较传统的解法又多了一个初学会比较陌生的辅助数组,所以在刚接触的情况下比较难以理解。 需要说明的是,kmp算法有非常多的改进或衍生版本,看每一个版本的说明时建议看到底再看其它版本,防止概念混淆。比如 next 数组的定义,某些版本
阅读全文
摘要:理解一个数据结构,我们应该首先明白该数据结构的作用与应用场景,尔后理清其逻辑结构,基于逻辑结构考虑如何在计算机上进行物理存储,最后对以上进行代码实现。 我们按上述思考顺序来实现一次线段树。 作用及应用场景 我们考虑一个场景,我们有一个长度为 n 的数组,我们需要经常进行两种操作: 1. 计算某个区间
阅读全文
摘要:前言 学习 λ 演算的初衷是为了更好的使用 JAVA8 的 lamda表达式,但是在学习过程中发现 λ 演算的作用和深度远远比想象的大的多得多。λ 演算的定义并不复杂,包括一条变换规则(变量替换)和一条函数定义方式,但其外延却囊括和渗透到了无数方向,乃至学习过程中脑中不断冒出一句话:内涵越小、外延越
阅读全文
摘要:题目: 关于动态规划类题目的思路如何找在上一篇博客 https://www.cnblogs.com/niuyourou/p/11964842.html 讲的非常清楚了,该博客也成为了了leetcode中戳气球题目点赞和阅读最多的题解(虽然题解本身就很少)。 本题的解题路径与上述博客一致,也是从 递归
阅读全文
摘要:堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 我们将给定的数组想象成一个完全二叉树,那么数组元素与二叉树节点的对应关系如下: 可以看到 0 的子元素为 1 、 2
阅读全文
摘要:并归排序与快速排序相似,靠分治思想突破了排序算法 O(n2) 的瓶颈。 我们看回顾一下几大排序算法的时间、空间复杂度: 排序算法平均时间复杂度最坏时间复杂度空间复杂度是否稳定 冒泡排序 O(n2) O(n2) O(1) 是 选择排序 O(n2) O(n2) O(1) 不是 直接插入排序 O(n2)
阅读全文
摘要:这道题目做了两个晚上,发现解题思路的优化过程非常有代表性。文章详细说明了如何从回溯解法改造为分治解法,以及如何由分治解法过渡到动态规划解法。解法的用时从 超时 到 超过 95.6% 提交者,到超过 99.8% 提交者。现整理下来分享给大家,如有错误评论区欢迎指正! 题目如下: 回溯法 刚看到这个题目
阅读全文
摘要:人类发明了轮子,提高了力的使用效率。 人类发明了自动化机械,将自己从重复的工作中解脱出来。 提高效率的方法好像总是离不开两点:拒绝无效劳动,拒绝重复劳动。人类如此,计算机亦如是。 前面我们说过了四数之和的递归和递推思路,递归和递推是一个比较通用的解题方法,我们可以以此为基础对解空间有一个整体的认识,
阅读全文
摘要:二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 二分查找思路非常简单,由粗暴的遍历查找改为了将元素排序后不断的进行折半查找,将搜索的时间复杂度由O(N)降到了O(log2N)。 二分查找的思
阅读全文
摘要:今天手撕八皇后。 问题背景:八皇后问题最早是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出。之后陆续有数学家对其进行研究,其中包括高斯和康托,并且将其推广为更一般的n皇后摆放问题。八皇后问题的第一个解是在1850年由弗朗兹·诺克给出的。诺克也是首先将问题推广到更一般的n皇后摆放问题的人之一。1874
阅读全文
摘要:在leetcode刷到两数之和、三数之和、四数之和的问题,发现题解都在使用滑动窗口、双指针的方法,在此补充一下递归与递推的解题思路(因为我的解题思路都是思考解空间-遍历解空间-聪明的遍历解空间-发现方法到达优化瓶颈,再思考其它方式如双指针、hash等,对递归和递推总有执念)。 注:递归解法往往效率不
阅读全文