- 博客(37)
- 收藏
- 关注
原创 Advantage Shuffle 优势洗牌解析以及java实现
Advantage Shuffle 优势洗牌解析以及java实现这一题给我们长度相等的两个数组A和B,要求我们返回一个数组,重新排列A,使得A中尽可能多的元素比相同位置上的B的元素要大。这一题应该是比较明显的要使用贪心算法来解决的,贪心算法只是一个思维,但是具体实现起来是比较难的。让我们明确一下解题思路,其实这一题和田忌赛马很像,如果当前的A中能找到比B[i]大的数字,则我们用比B[I]大的数字中最小的那个与之对应,如果没有则用A中没有用过的最小的数字与之对应。我们首先将A排序,然后用一个大堆来保存一
2021-03-24 22:32:14
166
原创 923. 3Sum With Multiplicity 三数之和的排列组合解析以及java实现
923. 3Sum With Multiplicity 三数之和的排列组合这一题和3Sum其实有点类似,作为一道衍生题,这一道题目允许出现重复的数字,但是要求index i,j,k需要是i<j<k的顺序。我们解题思路同样也是用哈希表来存储一个数字和出现次数的映射,分别用a,b来遍历哈希表,因为C可以通过target-a-b来得到。如果C不存在,则该组合不存在可以直接跳过。如果C存在,则分为三种情况,A = B = C, A = B != C, A != B != C. 这三种情况分别对应三种不
2021-03-24 12:58:55
204
原创 438. Find All Anagrams in a String 寻找字符串种所有的同位串
438. Find All Anagrams in a String 寻找字符串种所有的同位串先说一下题意,给一个字符串S,和一个模式串P,要求找到所有的P的同位串(Anagram)在S种的起始Index,Anagram的意思就是组成字符相同的字符串。这一道题有很多的解法,有一些时间复杂度比较高,这里我们就不多赘述了,就讲一种比较简单,代码量也不大而且时间复杂度为O(N)的解法。这一种方法主要是使用了滑动窗口和一个字符哈希数组来解决。主要思维为:1.新建一个256的数组用来存放当前窗口内所有的字符的
2021-03-23 21:48:56
235
原创 Check If a String Contains All Binary Codes of Size K 检查当前字符串是否包含了所有的K位二进制的数字
Check If a String Contains All Binary Codes of Size K 检查当前字符串是否包含了所有的K位二进制的数字拆解一下其实就是问我们,是否所有长度为K的二进制字符串都是S的字串,如果暴力破解显然是不行的明显会超时。于是我们换一种思维来看,长度为K的二进制的字符串一共又多少个?其实也就是包括0的话,一共有二进制所代表的最大值的+1个。如果K=2的话,则有00, 01,10,11 代表了从0到长度为K的二进制能表示的最大个数。K= 3的话则有000,001,010,
2021-03-12 23:40:54
120
原创 239. Sliding Window Maximum 滑动窗口最大值
239. Sliding Window Maximum 滑动窗口最大值这一题也是滑动窗口类型的题目,严格来说比上一篇的滑动窗口中位数要来的简单,滑动窗口中位数则需要两个堆来解决,而这一次我们只需要用一个双向队列即可。 在这个队列中我们存储的并不是数组中的值,而是存储的值的索引,在向双向队列尾部添加索引的时候,要将队列中所有比该索引对应的值小的缩影都移除,这样就可以保证队列的前端永远是该滑动窗口中的最大值。来让我们看看代码吧class Solution { public int[] maxSlid
2021-03-12 04:50:44
228
原创 Leetcode Sliding Window Median 滑动窗口中位数实现与解析
480. Sliding Window Median今天这道题是一道Hard的题目,给定一个特定大小的滑动窗口以及一个数组,每一次向后滑动一个位置,要求返回一个有着所有的中位数的数组。我们维护两个堆来解决这个问题,一个大堆一个小堆,我们保证当K为奇数的时候中位数是大堆顶端的数字,当K为偶数的时候,中位数则是大堆顶端和小堆顶端的数字和除以2.我们在向堆内添加和删除数字的时候都要尽量保持两个堆的大小相等或者相差不大于1。在向堆内添加数字的时候,如果当前的数字比大堆顶部的数字要小则将其加入大堆中,如果比大
2021-03-12 04:14:14
252
原创 Leetcode Trie前缀树相关题目解析以及java实现
Leetcode Trie前缀树相关题目解析以及java实现Trie 其实还是一个挺实用得数据结构得,可以做到和哈希表一样得查找时间复杂度在leetcode里面虽然不常见但是也还是能遇到得,我们来看看和Trie 相关的两道题目,让我们更好得理解Trie得实现。Design Add and Search Words Data StructureWord Search IIDesign Add and Search Words Data Structure这一题要求我们设计一种数据
2020-09-27 16:33:34
172
原创 Leetcode Number of island I & II 解析 以及java实现
Leetcode Number of island I & II 解析 以及java实现Number of island 是一道leetcode的经典BFS的题了,题目给一个二位的数组作为输入,1代表陆地,0代表海洋,如果陆地相连则是一个岛屿,让我们计算出当前数组内岛屿的数量。思路:大致思路就是我们先自己设定一个类用来存储坐标,在利用两个delta数组来存储位移的变量进行四方位移,然后利用BFS把岛屿进行合并,最后确定留下的岛屿都是不相连的就是我们最后得到的岛屿数量。class Soluti
2020-09-26 11:09:32
188
原创 Leetcode Binary search二分法算法相关题的java实现和解析
Leetcode Binary search二分法算法相关题的java实现和解析(第一篇)上一次做了二叉树的相关的题目的总结和java实现,然后这一次我们来处理二分法的相关的题目,严格来说二分法都是有通用的模板的,一般来说对于时间复杂度要求为O(nlogn)O(nlogn)O(nlogn) 的题目多半都可以用二分法来解决。让我们看看题目列表吧:Binary search(First position)Binary search(Last postion)Search and insert pos
2020-09-13 23:09:39
179
原创 Leetcode中二叉树性质相关的题目解析以及java实现
Leetcode中二叉树性质相关的题目解析以及java实现Maximum Depth of Binary Tree 二叉树的最大深度Minimum Depth of Binary Tree 二叉树的最小深度Maximum Width of Binary Tree:二叉树的最大宽度Same Tree:判断两棵二叉树是否相同Symmetric Tree:对称的二叉树(二叉树的镜像)Invert Binary Tree:翻转二叉树Subtree of Another Tree:判断二叉树是否为另一
2020-08-30 15:50:00
137
原创 Pancake sort煎饼排序的分析以及java实现
Pancake sort煎饼排序的分析以及java实现Pancake sort也是排序算法其中的一种,之所以叫做pancake sort是因为有一个特殊的操作叫做flip(int[] A,int k)就是将数组A[0,k]进行翻转,pancake sort的时间复杂度是O(n2)O(n^2)O(n2)的,我们通过两次翻转数组的操作来排序一个元素,我们首先找到最大的元素,先将这个元素通过一次翻转到数组的第一个位置,然后再通过一次翻转将这个元素翻转到最后一个位置上,然后这个元素我们就可以不用管了,然后再去处理
2020-08-30 12:02:18
548
原创 Leetcode中关于二叉树的转换类型题目的解析与java实现
Leetcode中关于二叉树的转换类型题目的解析与java实现这一类型的题目就是将不同的数据类型,像数组,链表等转换吃成为一个二叉树,或者是将二叉树转化成为其他的数据类型,让我们先看看题目,列表。[108] Convert Sorted Array to Binary Search Tree:有序数组转换到二叉搜索树[109] Convert Sorted List to Binary Search Tree:有序链表转换到二叉搜索树[114] Flatten Binary Tree to Lin
2020-08-26 22:35:04
203
原创 Leetcode二叉树的序列化和反序列化 java实现及解析
Leetcode二叉树的序列化和反序列化 java实现及解析Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in t
2020-08-25 12:29:29
295
原创 Leetcode Best Time to Buy and Sell Stock系列题目解析以及java实现
Leetcode Best Time to Buy and Sell Stock系列题目解析以及java实现这一个系列的题目就是让我们在一段连续的股票价格中根据限制来进行交易从而获得最大的利润,每一个衍生题都会设置一些限制Best Time to Buy and Sell Stock IBest Time to Buy and Sell Stock IIBest Time to Buy and Sell Stock IIIBest Time to Buy and Sell Stock with
2020-08-19 12:09:14
337
原创 Leetcode中二叉树中的路径相关题目解析以及java实现
Leetcode中二叉树中的路径相关题目解析以及java实现讲完了搜索问题,我们再来看看二叉树中的路径相关的问题,让我们先列出相关的题目[112] Path Sum:路径和(一)-是否存在二叉树路径和等于给定值(根节点到叶子节点)[113] Path Sum II:路径和(二)-二叉树中路径和等于给定值的所有路径(根节点到叶子节点)[437] Path Sum III:路径和(三)-二叉树中路径和等于给定值的所有路径(任意两个节点)[257] Binary Tree Paths:二叉树从根节点到
2020-08-18 10:42:03
177
原创 Leetcode中二叉树中的搜索相关题目解析以及java实现(第二篇)
Leetcode中二叉树中的搜索相关题目解析以及java实现(第二篇)接上一篇,继续看二叉树中的搜索的相关问题和java的实现。[236] Lowest Common Ancestor of a Binary Tree[156] Binary Tree Upside Down:[617] Merge Two Binary Trees:[654] Maximum Binary Tree:[563] Binary Tree Tilt:让我们开始吧![236] Lowest Common An
2020-08-16 10:37:46
152
原创 Leetcode中二叉树中的搜索相关题目解析以及java实现
Leetcode中二叉树中的搜索相关题目解析以及java实现这一类的题目其实稍微有一些杂,基本就是在二叉树中寻找一些或者某个特定值,题目比较多,我们会通过两道三篇来总结,不过总体来说也基本上就是BFS,分治法就可以解决的。让我们从简单的开始![513] Find Bottom Left Tree Value[199] Binary Tree Right Side View[515] Find Largest Value in Each Tree Row[671] Second Minimum
2020-08-15 11:43:48
154
原创 leetcode 二叉树的层序遍历整理以及java实现
leetcode 二叉树的层序遍历整理以及java实现二叉树的层序遍历再Leetcode里面有四道题是比较有代表性的,分别是:Binary Tree level order traversalBinary Tree level order traversal IIBinary Tree zigzag level order traversalBinary Tree Vertical order Traversal今天我们就分别看看这四道题的解析和java实现Binary Tree leve
2020-08-14 13:02:35
252
原创 二叉树的遍历的递归与非递归实现
二叉树的遍历的递归与非递归实现终于把经典题型都刷的差不多了,可以准备把二叉树相关的题目整理一下然后做一个总结,从遍历,层序遍历,构建,性质等各个方面分开来讲。然后再处理一下BFS,DFS以及DP。首先让我们看看二叉树的遍历吧,这是必须要学的基础内容,二叉树的遍历一共有3种,分别是前序遍历中序遍历后序遍历分别对应了4. 根左右5. 左根右6. 左右根的顺序。一般来说都会采用递归的方式实现这三种不同的遍历因为递归的写法非常的简便,让我们看看用java来实现这三种不同的遍历前序遍历c
2020-08-13 08:41:19
134
原创 Leetcode Pascal triangle i & ii 杨辉三角(帕斯卡三角)java实现以及解析
Leetcode Pascal triangle i & ii 杨辉三角(帕斯卡三角)java实现以及解析杨辉三角其实是初高中的知识了,其实也就是二项式系数的写法杨辉三角的第n行对应的就是二项式(a+b)n(a+b)^{n}(a+b)n 的系数,不过杨辉三角是zero index的,第一行其实是(a+b)0(a+b)^{0}(a+b)0 然后依次递推,就可以得到一个完整的杨辉三角了: 1 1 1 1 2 1 1 3 3 1 1 4 6
2020-08-13 00:37:00
230
原创 Leetcode 368. Largest divisible subset 最大整除子集
Leetcode 368. Largest divisible subset 最大整除子集让我们先看看题。题目概述给出一个由 无重复的 正整数组成的集合,找出其中最大的整除子集,子集中任意一对 (Si,Sj) 都要满足:Si % Sj = 0 或 Sj % Si= 0。如果有多个目标子集,返回其中任何一个均可让我们看看例子给出输入{1,2,3} 可以输出{1,2} 或者是{1,3}如果给出输入{1,2,4,8}则需要输出{1,2,4,8}这一题其实是需要选用动态规划的方法来解决这个问题,我们
2020-08-11 19:38:17
196
1
原创 归并排序 MergeSort的解析和java实现
归并排序 mergeSort 的解析和java实现mergeSort是稳定的O(nlogn)的排序算法,但是相比起其他的排序算法来说需要额外O(n)的空间。归并排序的主体思想就是把一整个数组不断的对半拆分,直到每一个子数组中都只有两个元素。然后对这两个元素进行排序。在对最小的子数组进行排序之后,进行合并,把两个子数组中最小的一个放到新数组的头部然后指针向后移。class MergeSort{ public static void mergeSort(int[] arr){ int[] copy
2020-08-09 02:21:32
332
原创 Leetcode LRU缓存的java实现及解析
Leetcode LRU缓存的java实现及解析LRU是least recent used的缩写,顾名思义就是最近没有用过的元素,LRU缓存的知识还是大三的时候学系统的时候学到的,其实就是一种类似提高缓存使用率的方式。大家都直到缓存其实是很小的,但是速度却非常的快,怎么样决定缓存里面存储什么样的元素很直接地影响系统的效率,当我们需要调用一个文件的时候系统会先去缓存里面找,如果找到了就返回,如果没找到才会去其他的地方找。LRU就是一种决定缓存内容的方式,也就是如果我们要放入缓存的内容大于缓存的容量,我们就
2020-08-04 02:59:30
461
原创 Leetcode word break I & II 词句拆分I和II的java实现及解析
Leetcode word break I & II 词句拆分I和II的java实现及解析word break i是leetcode 里面中等难度的题目而word break II 更是hard题目,两种实现也有所区别,题目也比较迷惑,让我们先看看第一题吧这一题其实看到也是觉得非常懵,好像除了暴力解法没有什么更好的方法,但是暴力解肯定会TLE的,后来看到了大神的解法之后才想到用DP去解决,不过DP也确实是博主最不擅长的算法了。让我们看看怎么用DP来做,首先我们有一个长度比字符串大1的布尔值的
2020-07-31 10:02:54
211
原创 Leetcode 394. Decode String 展开字符串的java实现(递归与非递归)
Leetcode 394. Decode String 展开字符串的java实现(递归与非递归)让我们先看看题吧!Given an encoded string, return its decoded string.The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is gua
2020-07-29 10:06:44
486
原创 Construct binarysearch tree from inorder & postorder Or preorder 利用中序遍历和前序遍历或后续遍历构建二叉搜索树
Construct binarysearch tree from inorder & postorder Or preorder 利用中序遍历和前序遍历或后续遍历构建二叉搜索树这一题其实也是leetcode中关于BST(Binary search Tree)的经典题型了,这一道就是给我们两个数组分别代表了一个BST的中序遍历和前序(另一题给的是后序遍历),为什么没有前序遍历和后序遍历的题呢?因为只给出前序遍历和后序遍历是无法确定唯一的BST的,但是前序+中序或者是后序+中序就可以。让我们先看看前
2020-07-27 15:51:34
184
原创 Sort colors 和 rainbow sort 彩虹排序的java实现
Sort colors 和 rainbow sort 彩虹排序的java实现Sort colors也是leetcode上面的一道经典题目了,012分别代表3种不同的颜色,输入一个含有三种颜色的数组,我们要将其按照升序排序,方法其实也非常简单,就是利用两个指针分别指向最后一个0的应该被放置的位置和第一个2应该被放置的位置,我们遍历这个数组,遇到0就和0指针交换,遇到2就和2指针交换这样在遍历结束之后我们的数组就被排序完成了,让我们看看sort colors的java实现吧。class SortColors
2020-07-26 18:03:16
1101
原创 Leetcode 15.3Sum 三数之和 的java实现
Leetcode 15.3Sum 三数之和3Sum 其实就是 twoSum的衍生题,相比较2Sum,寻找在一个数组中可以组成特定数字的两个数,3Sum要求我们寻找在一个数组中和为0的三个数。同样我们也可以通过哈希表的方式来实现,但是通过双指针的方式其实更加优雅一些。首先我们将会对数组进行排序,这里就消耗了nlogn的复杂度,所以这道题解法复杂度也就是O(nlogn)。一般我们在处理多个变量最后构成某个条件的题的时候,我们就是循环其中的一个变量然后根据当前这个变量的位置来继续确定后续的变量。首先我们循环
2020-07-25 17:40:26
207
原创 Leetcode 236. Lowest common ancestor二叉树里的最近祖先问的 java实现和其衍生
Leetcode 236. Lowest common ancestor二叉树里的最近祖先问的java 实现这道题其实就是要求我们找到两个给出节点的最近的父节点。我们可以利用分治法来处理,我们不断的在当前的节点向下寻找我们希望寻找的两个节点,如果找到了就返回找到的节点,如果同时找到两个节点就返回当前节点,因为当前节点就是我们希望寻找的lowest common ancestor(LCA). 让我们看看Java的实现吧。class LCA{ public TreeNode lca(TreeNode r
2020-07-24 12:16:05
135
原创 Leetcode 114. Flatten a binary Tree to LinkedList 将二叉树变为链表 java实现
Leetcode 114. Flatten a binary Tree to LinkedList 将二叉树变为链表 java实现这是一道在leetcode上面的中等难度的题目,让我们先看看题吧题目非常的简单直白,看完这个题目的解释应该就能够明白了。对于二叉树的操作,我们一开始能够想到的就是遍历或者是分治法。但是无论是哪一种方法我们都应该记录右子树的最后一个节点,也就是应该接上的位置,然后不断的将左子树转换过去,这样我们就可以将这个二叉树成功的变为链表了。让我们看看java实现的遍历解法吧publ
2020-07-23 10:42:07
155
原创 如何使用牛顿迭代开根号Newton iteration
如何使用牛顿迭代开根号Newton iteration一般说到整数的开根号其实我们都可以用很简单的二分法来解决,但是如果是浮点数的话则一般来说更多人一开始想到的方式就是使用牛顿迭代法来完成。牛顿迭代这个名字听起来好像非常的高大上,但是其实也算是比较基础的数学,让我们来分析一下牛顿迭代到底是怎么样解决开更好的问题吧。首先我们来看一下求根的函数式 f(x)=x2−vf(x) = x^2 - vf(x)=x2−v 当f(x)=0f(x) = 0f(x)=0的时候,x就是v\sqrt vv 了。看到这里其
2020-07-20 03:17:50
1411
原创 LintCode 437:Copy books Java实现
LintCode 437:Copy books Java实现Given n books and the ith book has A[i] pages. You are given k people to copy the n books.n books list in a row and each person can claim a continous range of the n books. For example one copier can copy the books from ith t
2020-07-19 21:11:52
415
原创 CourseSchedule I & II 课程规划 I& II Java 实现
CourseSchedule I & II 课程规划 I& II Java 实现课程规划,也是leetcode上面的经典题型了,包含原题和衍生题一共有4道,今天我们先看看I和II吧。当我们看到这种有前提条件的东西的时候,我们多半都可以将其化为有向图来理解,这样就可以通过图的遍历来处理这个问题了。而这一道题其实一看就知道本质就是再有向图中进行环的检测。我们利用一个二维数组来记录有向图,然后利用一个一维数组来记录当前节点的状态,-1为有冲突,1为访问过,0为没有访问过。然后对当前的节点
2020-07-19 12:16:06
192
原创 Rotated sorted array 中的搜索问题
Rotated sorted array 中的搜索问题Rotated sorted array (RSA)是一个比较特殊但是其实大家也很熟悉的数据结构,从名字我们就能看到RSA就是从普通的排序数组sorted array中演变而成的。让我们看一个例子:Sorted Array: 1234567Rotated Sorted Array 5671234其实就是将普通的排序数组进行了头尾相连的转动。今天我们在这篇文章中将会讲到3种在Rotated sorted array中的搜索问题。Find mi
2020-07-17 19:44:06
172
原创 Search in big sorted Array 在无限大的有序数组中进行搜索
Search in big sorted Array 在无限大的有序数组中进行搜索这一题是比较简单的一题,当我们看到有序数组和搜索这两个给出的条件的时候,我们就应该l思考这道题如何使用二分搜索去完成。顾名思义,无限大的数组就是拥有无限多个元素的数组,既然拥有无限多的元素,那我们要怎么样确定用于二分搜索的尾部呢?当然也是用“二分法”,我们使用一个数值来记录当前的元素的下标当当前下标所标记的元素小于目标元素时则直接将下标乘二,既然是无限大的数组,也不用担心会越界。这样我们就可以得到一个可以用于二分搜索的尾部
2020-07-17 10:10:15
308
原创 Median of two sorted Array 寻找两个有序数组的中位数
Median of two sorted Array 寻找两个有序数组的中位数这一道题是leet code 上面的一道Hard problem,其主要的难度在于其要求在时间复杂度为O(log(m+n))O(log(m+n))O(log(m+n)) 的情况下完成。一般当我们看到这个题的时候第一反应就是用Merge two sorted array的方法去完成,但是这样的话时间复杂度就无法满足要求,因为merge two sorted array需要O(m+n)O(m+n)O(m+n)的时间。那如何才能在
2020-07-16 16:56:24
230
原创 QuickSort与QuickSelect 的原理与java实现
QuickSort与QuickSelect 的原理与java实现QuicksortQuickSort 可以说是在面试当中最容易遇到的排序算法了,在最好的情况下时间复杂度为O(nlogn)O(nlogn)O(nlogn) 最坏的情况下是O(n2)O(n^2)O(n2)。快排的思想,选取一个基准值pivot,并通过遍历数组的方式将数组分为两个部分,小于基准值的与大于基准值的。再对两个数组进行递归运算,直到最后两个数组内都只有一个元素时停止。java实现:class QuickSort{ publi
2020-07-15 14:37:30
432
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人