![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
_CoderZxk
Talk is cheap.Show me your code
展开
-
LeetCode 226. 翻转二叉树 及 二叉树方面一些题目的练习
翻转一棵二叉树。 示例: 输入: 4 / 2 7 / \ / 1 3 6 9 输出: 4 / 7 2 / \ / 9 6 3 1 备注: 这个问题是受到 Max Howell 的 原问题 启发的 : 谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。 这道题是经典的二叉树反转问题,Homebrew的作者当时也没做出来,被谷歌拒之门外。 其实,这道题用递归去做相当简单 看图 .原创 2020-08-11 21:23:50 · 115 阅读 · 0 评论 -
LeetCode 279. 完全平方数
完全平方数这题我就用BFS去解了,因为我感觉最容易理解的就是BFS(?)至少现在这么认为。。。 广度优先遍历就是利用队列,如图所示,12入队,12出队,现在我要消耗完13,那么只有i<n^2的范围内,也就是说剩下的数字就是11,8,3,接着,这三个数字入队,以此类推衍生除了10,7,2,7,4,2这些,再将其入队,又可得出子子子子节点,何时结束呢,一直找到那个消耗完的时候就结束了 未被优化的算法 public int numSquares(int n) { Queue<In原创 2020-08-10 21:34:31 · 102 阅读 · 0 评论 -
LeetCode 20.有效的括号[对栈和队列的应用]
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 1: 输入: “()” 输出: true 示例 2: 输入: “()[]{}” 输出: true 示例 3: 输入: “(]” 输出: false 示例 4: 输入: “([)]” 输出: false 示例 5: 输入: “{[]}” 输出: true 栈解法 对于这道题,我一开始用.原创 2020-08-09 18:58:32 · 111 阅读 · 0 评论 -
LeetCode 206 反转链表
反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? 从微观角度来看,先解决第一轮链表反转,第一轮当然是1->2节点的反转,先初始化一个pre节点,这个节点为null,接着先把cur的下个节点保存起来,因为我们后期要维护这个节点,就设置成tmp吧。我们迎来了最重要的一个环节,就是红色箭头那个操作,cur的.原创 2020-08-08 21:14:34 · 112 阅读 · 0 评论 -
leetcode 219 存在重复元素 II
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。 示例 1: 输入: nums = [1,2,3,1], k = 3 输出: true 示例 2: 输入: nums = [1,0,1,1], k = 1 输出: true 示例 3: 输入: nums = [1,2,3,1,2,3], k = 2 输出: false O(N^2)解法 暴力破解 首先最容易想到的解法就是用O(n^2)复.原创 2020-08-07 14:27:07 · 232 阅读 · 0 评论 -
集合
集合是一个相对来讲比较好懂的数据结构,在高中课本中集合就是不重复的一组数据,那么我们如何用代码描述集合呢,我们前面讨论过二叉树这个概念,这个概念是没有重复元素的,也就是说,我们完全可以用二叉树这个数据结构为基础实现一个集合,具体代码如下 package BST; public class BST<E extends Comparable<E>> { class N...原创 2020-04-12 20:53:30 · 87 阅读 · 0 评论 -
非递归实现二叉树的遍历
今天再讨论一下二叉树,时隔将近一个月,二叉树操作基本上又忘光了。。。- -! 那么实现递归的二叉树,就是不断的去寻找子树中的元素, 前序遍历就是中间节点->左子树->右子树 那么用递归的方法去实现这个前面的文章已经讲过了,在此不过多赘述~ 非递归怎么实现呢?很多读者都知道栈这个数据结构吧,它是一种LIFO(Last In First Out)后进先出的数据结构, 所以我们可以这样来想...原创 2020-04-11 20:06:50 · 209 阅读 · 0 评论 -
并查集
关于并查集的实现思路呢有两种,先讨论第一种 数组实现并查集 首先来看个案例 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 这是两串数字 但是,你们也可以当成索引,我自己连我自己,我的索引就是我自己,我对应的数也是我自己。 我们可以把这10个数的当成十个开发者,一开始我全能,我全栈,一个人接私活,我就是我,时间自由 但是这编号 7 的开发者他感觉一个人玩儿没劲,...原创 2020-01-31 17:09:37 · 85 阅读 · 0 评论 -
二叉树
二叉树是个类似堆一样的东西,只不过我之前讨论的堆使用数组实现,而二叉树用类似链表一样的实现 规则: 二叉树规则就是从顶层开始算根节点,左孩子比根节点小,右孩子比根节点大 左子树一般是小的,右子树一般较大 所以我们可以得出结论,最左边那个孩子节点一定是最小的,最右面那个孩子节点一定是最大的 1 2 3 4 5 6 7 **8** 这个就是树,而且是个完全二叉树 我们再插入一个8 8...原创 2020-01-19 22:15:14 · 212 阅读 · 0 评论 -
二分查找
二分搜索是一种非常高效的查找算法,我们通常可以用for循环一遍进行查找一个数组的某个数,时间复杂度呢也是O(n)型,但是,10个数也许非常高效,但是10w个呢,100w个呢,就显得很漫长了。我们可以用二分查找来进行查找 1,23,45,65,67,73,88,99,130 我们想知道值为88的那个索引是否在这个数组中 当然我们遍历一遍这个数组,假如在就返回数值,不在返回-1,也无可厚非 但是假如1...原创 2020-01-17 14:41:22 · 161 阅读 · 0 评论 -
快速排序算法
这个算法比较妙的地方在于有左右两个针指向左右两边断点,初始化数组的第一个值为【坑】,左指针和右指针分别和坑这个值对比,比坑小的给放在坑的左边,左指针右移,比坑大的放在右面,右指针左移,当左右指针见面的时候,循环结束,此时循环到这个索引就是这个数在这个数组中应该所处的位置。 1,2,3,4,5,6,7,8,9,10 从一个有序数组中来看,任何一个数都是比它们左边数字大,比它们右边数字小的这个规律 所...原创 2020-01-15 12:21:33 · 73 阅读 · 0 评论 -
堆和堆排序
堆,顾名思义,小山堆,最标准的形状就是金字塔 1 2 3 4 5 6 7 这个三角就是简易的堆 我们可以看出堆的关系时根节点下有两个子节点构成,根节点为k,左孩子就是2k,右孩子就是2k+1,颠倒来讲,当孩子节点的索引为k,那么它的母节点的索引为k/2,这个概念是我们接下来讨论shiftup和shiftdown问题的关键。 ...原创 2020-01-11 11:27:36 · 115 阅读 · 0 评论 -
归并排序
归并排序是一种比较容易被理解但是比较难被实现的排序,与其他排序不同,它需要去虚拟出一个暂时的数组,这种数组占据一定的空间,用空间来替换时间,在现在硬件较为快速,所以这种替换比较划算,归并排序也顺理成章地成为了O(nlogn)算法,它的思想在于一分为二,有两个标记位我们称为左标记位和右标记位,一分为二的数组,它们是有序的,以如下数组为例 1,3,7,9,2,3,8,10 我们看到这个例子可以分为两...原创 2020-01-05 11:41:52 · 159 阅读 · 0 评论 -
插入排序及改进
插入排序是个常见的o(n^2)排序,举个例子 1,9,3,2,4,3,4,5 插入排序呢就是第一轮我要和第一个比较 int[] sort = RandomUtil.randomArr(); for (int i = 1; i < sort.length; i++) { for (int j = 0; j < sort.lengt...原创 2020-01-04 17:37:04 · 273 阅读 · 0 评论 -
选择排序
选择排序,顾名思义就是选择 究竟怎么选, 看如下数组 [1, 32, 23, 21, 34, 2, 35, 54] 一轮排序就是个标记位 每走过一轮就排序一组 比如第一轮,从[0,8)这个索引标记位开始遍历 1, 32, 23, 21, 34, 2, 35, 54 我设个最大minIdx,二次循环开始根据这个最小数值不断刷新,更新这个minIdx,这样就能刷出最小的值,再将最小的值与所在标记位进行...原创 2020-01-03 11:37:42 · 99 阅读 · 0 评论