
算法
麦田里的守望者_zhg
如果有人碰到别人在穿越麦田,我一定会抓住他...
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode刷题之 【剑指 Offer 54. 二叉搜索树的第 k 大节点】
1 题目给定一棵二叉搜索树,请找出其中第k大的节点。示例 1:输入: root = [3,1,4,null,2], k = 1 3 / \1 4 \ 2输出: 4示例2:输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \原创 2020-11-24 16:24:50 · 236 阅读 · 0 评论 -
LeetCode刷题之 【剑指 Offer 28. 对称的二叉树】
1 题目请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ \2 2/ \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ \2 2\ \3 3示例 1:输入:root = [1,2,2,3,4,4,3]输出:true示例 2:输入:root = [1,2,2,null,3,null,3原创 2020-11-24 15:53:24 · 247 阅读 · 0 评论 -
LeetCode刷题之 【剑指 Offer 19. 正则表达式匹配】
1 题目请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。示例 1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa”p = “a*”输出: true解释: 因为 ‘原创 2020-11-23 19:27:49 · 262 阅读 · 0 评论 -
LeetCode刷题之 【下一个排列】
1 题目实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/next-permutation著作权归领扣网络所有。商原创 2020-11-10 21:19:59 · 210 阅读 · 0 评论 -
Leetcode刷题之 【215. 数组中的第K个最大元素】
1 题目在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/kth-largest-element原创 2020-10-22 18:47:57 · 448 阅读 · 0 评论 -
面试题之 【根据二叉树的度求节点个数】
1 度首先说说什么是度:通俗的讲二叉树中连接节点和节点的线就是度,有n个节点,就有n-1个度,节点数总是比度要多一个,那么度为0的节点一定是叶子节点,因为该节点的下面不再有线;度为1的节点即:该节点只有一个分支;同理度为2的节点就是有两个分支。在二叉树中不可能存在度为3或大于3的节点!关于度和节点之间的关系还有很多公式:度为0的节点数为度为2的节点数加1,即n0=n2+1这个公式的推理方法如下:设:k:总度数k+1:总节点数n0:度为0的节点n1:度为1的节点n2:度为二的节点根据二叉树原创 2020-10-20 09:21:43 · 3151 阅读 · 0 评论 -
Leetcode刷题之 【N皇后问题】
1 题目n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。示例:输入:4输出:[[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", // 解法 2“Q…”,“…Q”,“.Q…”]]解释: 4 皇后问题存原创 2020-10-19 21:46:02 · 946 阅读 · 0 评论 -
面试之 【查找算法】
1 顺序查找就是简单的从左往右或者从右往左遍历,待查找的数组并不需要有序,查到返回true,否则返回false。时间复杂度:最优时间复杂度是O(1),需要查找的元素就是第一个或者是最后一个最差时间复杂度是O(n),待查找的在查找顺序的最优一个位置平均时间复杂度是O(n)。public class SequenseSearch { public boolean search(int[]nums,int target){ if (nums.length==0)原创 2020-10-19 20:13:41 · 287 阅读 · 0 评论 -
面试题之 【单例模式的几种实现】
1 双重加锁单利模式是设计模式中最基础的设计模式之一,且也是唯一能够使用几十行代码就能够写出来的一种设计模式,所以也是面试中经常问到的题目。单利模式的实现比较简单,如果想要达到高效且线程安全那也是需要点技巧的。public class Person { private Person(){} private static volatile Person person; public static Person getInstance(){ if (per原创 2020-10-14 16:24:03 · 271 阅读 · 0 评论 -
Leetcode刷题之 【寻找重复数】
1 题目给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组(假设数组是只读的)。只能使用额外的 O(1) 的空间。时间复杂度小于 O(n2) 。数组中只有一个重复的数字,但它可能不止重复出现一次。来源:力扣(LeetCode)链接:原创 2020-10-12 20:11:31 · 387 阅读 · 0 评论 -
面试题之 【01背包问题】
1 题目一个背包的总容量为V,现在有N类物品,第i类物品的重量为weight[i],价值为value[i]。那么往该背包里装东西,怎样装才能使得最终包内物品的总价值最大。2 解题思路本题目的解题思路类似金矿问题,放到背包里面的物体要么整个放进去,要么就不放。那么根据动态规划的思路就有下一下两种情况:放进背包:此时将物体i放进背包,那么所剩物体减少1个,背包所能继续装物体的重量为V-weight[i],背包总价值加上物体i的价值。不放:此时不放到背包中,所剩物体减少1个,背包所能继续装物体原创 2020-10-12 17:04:43 · 638 阅读 · 0 评论 -
面试题之 【挖金矿问题】
1 题目有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?2 思路此问题是一道经典的动态规划(Dynamic programming)问题,简称DP问题,动态规划问题求解的三要素有一下三点:全局最优解最优子结构问题的边界对该金矿问题(假设共有n个金矿,共有w个工人,金矿的含金量数组为g,每个金矿所需开采工人的数组为原创 2020-10-10 12:00:57 · 1732 阅读 · 0 评论 -
面试题之 【删除k个数字后的最小值】
1 题目给出一个整数,从该整数中删除k个数,要求在删去k个数之后,新的整数要尽可能的小,编写一个这样的函数,传入一个正整数和待删除的个数k(k的大小小于等于正整数的长度)。举例:input: n = 3459, k =1output: 359input: n= 1593212, k = 3output: 1212input: n=12345, k= 2output: 123input: n = 41270936, k = 2output: 1209362 思路一下子删去k个数,想原创 2020-10-09 15:54:03 · 1184 阅读 · 0 评论 -
面试题之 【寻找全排列的下一个数】
1 题目给出一个正整数,找出这个正整数所有数字全排列的下一个数。比如:12345->1235412543->1254312354->1243512435->124532 思路可分成三种情况进行分析,当数字组合已经是逆序排列时,比如:54321,已经是所有数字组合中的最大值,直接返回原数。当数字组合的倒数两位是顺序排列时,比如:12345、13245、14523,直接将最后两位交换位置即可。即12345->12354、13245->13254原创 2020-10-09 14:17:32 · 670 阅读 · 0 评论 -
桶排序应用之 【计算无序数组有序之后的最大相邻元素差】
1 题目编写一个函数,传入一格无序的数组,返回无序数组排序之后的最大相邻元素的差。举例:输入:[5, 7, 2, 9, 10, 20, 44, 39]输出:192 思路1(暴力破解)先使用一种时间复杂度为O(logn)的排序算法将无序数组排好序然后在依次求相邻元素的差,并保存最大的差值。这种方法肯定能解决该问题,但是这样做的算法时间复杂度太高,接近O(n*n)。public int bruteForce(int []nums){ int distance = 0;原创 2020-10-07 20:32:27 · 345 阅读 · 0 评论 -
Leetcode刷题之 【剑指 Offer 59 - II. 队列的最大值】
1 题目请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1示例 1:输入:[“MaxQueue”,“push_back”,“push_back”,“max_value”,“pop_front”,“max_value”][[],[1],[2],[],[],[]]输出: [null,null,null,2,1,原创 2020-10-07 17:31:02 · 258 阅读 · 0 评论 -
LeetCode刷题之 【面试题 02.08. 环路检测】
1 题目给定一个链表,如果它是有环链表,实现一个算法返回环路的开头节点。有环链表的定义:在链表中某个节点的next元素指向在它前面出现过的节点,则表明该链表存在环路。示例 1:输入:head = [3,2,0,-4], pos = 1输出:tail connects to node index 1解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:head = [1,2], pos = 0输出:tail connects to node index 0解释:链表中有一个环原创 2020-10-06 21:13:18 · 259 阅读 · 0 评论 -
面试题之 【链表是否有环】
1 判断一个链表中是否有环以上面这个链表为例,链表中出现了环路,但是如何检测出该链表是否含有环路呢?1.1 思路使用两个指针,一个快指针和一个慢指针,使用快指针追赶慢指针,当两个指针相遇,那么证明该链表中存在环路。1.2 Java代码 /** * 追赶理论:当两个人在一个环形跑道上跑步时,只要其中一个人的速度比另一个人的速度快, * 那么只要给足够多的时间。该速度快的人一定能追上那个速度慢的人。 * 思路: * 使用两个指针,一个慢指针,一次移动一格,原创 2020-10-06 21:11:09 · 301 阅读 · 0 评论 -
数据结构之桶排序
1 桶排序桶排序是计数排序的一个扩展,计数排序相当于每个桶只能存放相同的元素,而桶排序则是可以存放一定区间内的元素,将所有元素放到桶中以后,然后对每个非空桶中的元素进行排序,最后打印输出即可。1.1 确定桶的个数确定的个数的方式有很多,比如:可以直接使用和原始数组长度相同的桶的个数,然后每次计算每个元素应该放在哪个桶中桶的长度:array.sizemax和min表示数组中的最大值和最小值确定每个元素应该放在哪个桶中,使用公式:(max-min)*(array.size-1)/(max-m原创 2020-10-06 16:25:20 · 1417 阅读 · 0 评论 -
数据结构之计数排序
1 计数排序计数排序是一种比较快速的排序方法,相对于冒泡排序、快速排序、堆排序、鸡尾酒排序等,计数排序是一种不需要进行元素之间对比的排序算法,但是该算法也有一定的局限性。算法思路:需要使用一个计数数组,将待排序数组中的每个元素遍历一遍,将每个元素出现的个数放到计数数组中,元素的值是多少就在计数数组相应的下标元素上的计数加1。举例:待排序数组:[2,4,3,2,2,2,5,5,6,2,9,8,8,9]通过计算,可以知道当前数组的最大值是9,所以创建一个大小为9+1的数组,然后遍历该数组,并记录每个原创 2020-10-06 11:13:57 · 1194 阅读 · 0 评论 -
数据结构之快速排序
1 快速排序快速排序是一种由分治思想而设计的一种排序算法,其时间复杂度最好为O(nlogn),最差为O(n*n),所以该方法是一种不稳定的排序算法。2 双指针法双指针法是使用两个指针来定位基准值前后两部分的元素,left和right指针。需要注意:先对right指针进行比较,然后才对left指针进行比较2.1 Java代码实现升序排序public class QuickSort { private int[] array; public QuickSort(int[] a原创 2020-10-05 21:22:23 · 917 阅读 · 0 评论 -
数据结构之堆排序(升序和降序)
关于堆这种数据结构,可以观看这篇文章【数据结构之堆】,要是不了解的话。1 升序排序升序排序使用最大堆,降序排序排序使用最小堆,并不是说只能这样用,只是这种设计会比较简洁。这里以升序排序为例,每次需要将当前堆调整为最大堆,然后将堆顶元素(数组第0个元素)和最后一个元素(第size-1个元素)进行交换。然后对前面的(n-1)个元素调整成最大堆,但是需要注意:此时,堆相当于删除了对顶元素,然后最后一个元素换到堆顶的位置,此时需要重新调整,但是堆的大小也减小了1。所以,此时调整的应该是n-1个元素的堆。p原创 2020-10-05 18:55:32 · 5435 阅读 · 0 评论 -
数据结构之堆
1 堆堆是一种特殊的二叉树数据结构,它是一颗完全二叉树,即直到最后一个叶子节点,中间没有空缺节点。由于堆是完全二叉树,那么就可以使用线性数据结构数组来进行表示:当直到根节点的索引时,可以计算出左右子树的节点索引:parentIndex = i;leftChildIndex = 2 * i +1;rightChildIndex = 2 *i +2;当直到子节点的索引时,可以直到父节点的索引:if leftChildIndex = i parentIndex = (leftChildInde原创 2020-10-05 18:42:34 · 209 阅读 · 0 评论 -
位运算便利店
1 判断奇数和偶数如果不用位运算的话,那么大部分的判断奇数偶数的方式应该是下面这种:if (a % 2 == 0) //是偶数else //是奇数如果使用位运算的话,可以提高效率:if ((a & 1) == 0) //是偶数else //是奇数因为奇数的二进制表示的最后一位肯定是1,偶数的二进制表示的最后一位肯定是0,所以可以采用这种方式进行判断。2 除2做除法也可以使用位运算,普通的除法虽然效率很高,但是并没有二进制的除法效率高,因为二进制是计算机最底层的表示。但原创 2020-10-05 10:56:16 · 163 阅读 · 1 评论 -
数据结构之鸡尾酒排序
1 鸡尾酒排序当冒泡排序的基础上,鸡尾酒排序进一步对其进行了优化,由于冒泡排序会对一些已经排好序的数列进行比较,浪费了很多比较次数,所以鸡尾酒排序:当第一轮从左到右排序确定了一个最大(最小)值之后,然后就从右向左进行比较往回走,在从右向左比较完之后,数列中的最小(最大)值被浮到最前面的位置。2 代码实现import java.util.Arrays;public class CockTailSort { public void cockTailSort(int[] arrayLike) {原创 2020-10-04 20:44:13 · 293 阅读 · 0 评论 -
数据结构之冒泡排序及其优化
1 冒泡排序顾名思义,冒泡就是像水中的泡泡一样,一步一步将需要排序的数列中的最大值或者最小值浮到最上面来。2 代码实现public void bubbleSort(int[] arrayLike) { int n = arrayLike.length; for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arrayLike[j] &g原创 2020-10-04 19:47:14 · 256 阅读 · 0 评论 -
Leetcode刷题之 【最近的请求次数】
1 题目写一个 RecentCounter 类来计算特定时间范围内最近的请求。请你实现 RecentCounter 类:RecentCounter() 初始化计数器,请求数为 0 。int ping(int t) 在时间 t 添加一个新请求,其中 t 表示以毫秒为单位的某个时间,并返回过去 3000 毫秒内发生的所有请求数(包括新请求)。确切地说,返回在 [t-3000, t] 内发生的请求数。保证每次对 ping 的调用都使用比之前更大的 t 值。示例 1:输入: [“RecentCoun原创 2020-10-03 21:58:57 · 375 阅读 · 0 评论 -
数据结构之单调队列的实现
1 什么是单调队列顾名思义,单调队列原则上也是一种队列,只不过在队列的基础上,有一些额外的功能是基本的队列所没有的。比如说每次出队的元素都比上一次的元素大或者小,这就是一种单调队列。2 Java代码实现import java.util.LinkedList;import java.util.Queue;/** * 单调队列 */public class MonoQueue { private boolean up = true; private Queue<Integ原创 2020-10-03 19:46:30 · 695 阅读 · 0 评论 -
Leetcode刷题之 【剑指 Offer 59 - I. 滑动窗口的最大值】
1 题目给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7原创 2020-10-03 18:58:14 · 131 阅读 · 0 评论 -
Leetcode刷题之 【设计循环队列】
1 题目设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:MyCircularQueue(k): 构造器,设置队列长度为 k 。Front: 从队首获取元素。如果队列为空,返原创 2020-10-03 18:54:10 · 524 阅读 · 0 评论 -
二叉树的深度优先遍历,前、中、后序遍历的递归和非递归实现
1 递归实现1.1 前序遍历前序遍历的顺序是:root->left->right。使用递归的形式很简单,但是因为使用了递归,所以多做了很多重复的工作,使得代码复杂度很高,但是代码简单易读。 public void preOrderTrversal(TreeNode root){ if (root!=null){ System.out.print(root.getVal()+" "); preOrderTrversal(root.getL原创 2020-09-30 16:02:48 · 1215 阅读 · 0 评论 -
Leetcode刷题之 【杨辉三角】
1 题目给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。在杨辉三角中,每个数是它左上方和右上方的数的和。示例:输入: 5输出:[[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/pascals-triangle著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2 Java代码 //链表实现原创 2020-09-28 21:27:20 · 141 阅读 · 0 评论 -
Leetcode刷题之 【买卖股票的最佳时机】
1 题目给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。示例 2:原创 2020-09-28 20:14:00 · 184 阅读 · 0 评论 -
Leetcode刷题之 【二叉树的最小深度】
1 题目给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2.来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-depth-of-binary-原创 2020-09-28 19:21:21 · 355 阅读 · 0 评论 -
Leetcode刷题之 【相同的树】
1 题目给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入: 1 1 / \ / \原创 2020-09-20 09:59:56 · 121 阅读 · 0 评论 -
Leetcode刷题之 【对称二叉树】
1 题目给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \ 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3进阶:你可以运用递归和迭代两种方法解决这个问题吗?来源:力扣(LeetCode)链接:https:原创 2020-09-19 10:50:08 · 315 阅读 · 0 评论 -
Leetcode刷题之 【二叉树的层次遍历 II】
1 题目给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其自底向上的层次遍历为:[[15,7],[9,20],[3]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-level-or原创 2020-09-19 10:09:02 · 223 阅读 · 0 评论 -
Leetcode刷题之 【搜索插入位置】
1 题目给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems原创 2020-09-19 09:51:24 · 194 阅读 · 1 评论 -
Leetcode刷题之【外观数列】
1 题目给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。注意:整数序列中的每一项将表示为一个字符串。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:111211211111221第一项是数字 1描述前一项,这个数是 1 即 “一个 1 ”,记作 11描述前一项,这个数是 11 即 “两个 1 ” ,记作 21描述前一项,这个数是 21 即 “一个 2 一个 1 ” ,记作 1211原创 2020-09-19 09:46:19 · 291 阅读 · 0 评论 -
Leetcode刷题之 【最后一个单词的长度】
1 题目给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。示例:输入: “Hello World”输出: 5来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/length-of-last-word著作权归领扣网络所有。商业转载请联系官方授原创 2020-09-19 09:40:28 · 219 阅读 · 0 评论