从快排想到的
首先我们先知道什么是快排 快速排序是一种基于分而治之的排序算法,其中: 通过从数组中选择一个中心元素将数组划分成两个子数组,在划分数组时, 将比中心元素小的元素放在左子数组, 将比中心元素大的元素放在右子数组。 左子数组和右子数组也使用相同的方法进行划分,这个过程一直持续到每个子数组都包含一个元素为止。 最后,将元素组合在一起以形成排序的数组。 中心元素(pivot element):有的地方翻译为:枢轴元素、基元,基准元素,我这里就叫做中心元素
设计模式复习
设计模式怎么产生的? 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。 项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。 GOF他们所提出的设计模式的面向对象设计原则 对接口编程而不是对实现编程。 优先使用对象组合而不是继承。 设计模式在软件开发中的两个主要用途 开发人员的共同平台 最佳的实践 设计模式的类型 创建型模式(Creational...
springboot笔记
run方法流程分析 配置文件 application.properties 语法结构 :key=value application.yml 语法结构 :key:空格 value 场景 字面量:普通的值 [ 数字,布尔值,字符串 ] 对象、Map(键值对) 数组( List、set ) 修改SpringBoot的默认端口号 给实体类直接注入匹配值 以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理; 一句话总结...
Java-Lambda
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。 lambda表达式的重要特征: 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。 例子// 1. 不需要参数,返回值为 5 () -> 5 // 2. 接收一个参数(数字类型),返回其2倍的值 x -> 2 * x // 3. 接受2个参数(数字),并返回他们的差值 (x, y) -> x – y // 4. 接收2个int型整数,返回他们的和 (int x, int y) -> x + y // 5. 接受一个 string...
mybatis-plus-imooc
MybatisPlus学习笔记_向天再借500年的博客 MyBatis-Plus笔记(入门) 4小时学会MyBatis Plus通俗易懂,从入门到部署上线-楠哥教你学Java MyBatis-Plus入门-慕课网 SSM传统编程模式
贪心算法-代码随想录
贪心一般解题步骤 将问题分解为若干个子问题 找出适合的贪心策略 求解每一个子问题的最优解 将局部最优解堆叠成全局最优解
二叉树知识点-labuladong
遇到一道二叉树的题目时的通用思考过程是: 是否可以通过遍历一遍二叉树得到答案? 如果可以,用一个 traverse 函数配合外部变量来实现。 是否可以定义一个递归函数,通过子问题(子树)的答案推导出原问题的答案? 如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值。 无论使用哪一种思维模式, 你都要明白二叉树的每一个节点需要做什么,需要在什么时候(前中后序)做。 一旦你发现题目和子树有关,那大概率要给函数设置合理的定义和返回值,在后序位置写代码了。遇到子树问题,首先想到的是给函数设置返回值,然后在后序位置做文章。「遍历」和「分解问题」两种思维方式二叉树的构造问题一般都是使用「分解问题」的思路: 构造整棵树 = 根节点 + 构造左子树 + 构造右子树。
二叉树知识点-代码随想录
一提到二叉树遍历的迭代法, 可能立刻想起使用栈来模拟深度遍历, 使用队列来模拟广度遍历。
回溯三部曲-代码随想录
回溯三部曲 回溯函数模板返回值以及参数 习惯是函数起名字为backtracking 函数返回值一般为void 一般是先写逻辑,然后需要什么参数,就填什么参数。 回溯函数伪代码如下:void backtracking(参数) 回溯函数终止条件 回溯函数终止条件伪代码如下:if (终止条件) { 存放结果; return; } 回溯搜索的遍历过程 回溯函数遍历过程伪代码如下:for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { 处理节点; backtracking(路径,选择列表); // 递归 回溯,撤销处理结果 } for 循环可以理解是横向遍历: for 循环就是遍历集合区间,可以理解一个节点有多少个孩子,这个 for 循环就执行多少次。 backtracking(递归)就是纵向遍历 backtracking 这里自己调用自己,实现递归。 回溯算法模板框架void backtracking(参数) { if (终止条件)...
递归三部曲-代码随想录
递归三部曲 确定递归函数的参数和返回值 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件 写完了递归算法,运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。 确定单层递归的逻辑 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。 举例 // 前序遍历·递归·LC144_二叉树的前序遍历 class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<Integer>(); preorder(root, result); return result; ...