
leetcode
文章平均质量分 88
java冢狐
这个作者很懒,什么都没留下…
展开
-
【剑指Offer】解题思路拆解Java版——第五期
下面这段时间带来的是对于剑指Offer(第二版)一书中的算法题目进行阅读并分享。原书中一共66道题目,我们就一天11道,用六天的时间来进行讲解,最后一天来个总结,争取在一周的时间内介绍完这66道经典题目。要是喜欢的欢迎关注公众号《Java冢狐》来追更!今天是剑指Offer的第五期,另外由于原书是C++代码编写而成,这边我们用Java来实现一遍,顺便说一下相关的面试知识点,一起进行面试前的复习。希望大家能够喜欢。另外有些地方的讲解可能并不是十分到位,在此更推荐更大家去看原书。那么话不多少,让我们开始今原创 2021-04-08 16:04:43 · 156 阅读 · 0 评论 -
日拱一卒——LeetCode 144.二叉树的前序遍历
大家好呀,今天为大家带来的LeetCode的题目是LeetCode 144.二叉树的前序遍历。属于树操作中基础中的基础的题目。题目分析通过题目我们就知道该题目有两种解法:递归和迭代。所谓的前序遍历就是根节点——左子树——右子树。递归和迭代的区别递归:循环调用迭代:上一个问题是下一个问题的起点解法一:递归我们只需要现将根节点加入答案,然后递归调用左子树,然后再递归调用右子树即可。解法二:迭代其本质和递归一样,就是需要显式的维护一个栈。代码实现解法一: public原创 2020-10-27 17:40:11 · 266 阅读 · 0 评论 -
日拱一卒——LeetCode 1365.有多少小于当前数字的数字
大家好呀,今天为大家带来的LeetCode的题目是LeetCode 1365.有多少数字小于当前数字的数字。题目分析对于这个简单题目来说,最先想到的方法就是暴力算法,对于每一个元素都遍历一遍数组,找到比它小的数字然后记下。这样做当然可以,但是过于暴力,我们要想办法简化这个过程,对于这个数组来说,我们可以将数组变为二维数组,第一行代表其值,第二行代表其位置。然后对第一行进行排序。对于排序完的二维数组,将至变为一维数组并输出。其下标是第二行其值是对应的位置减一。或者对其进行计数排序,建立一个一维数组原创 2020-10-26 16:47:24 · 280 阅读 · 0 评论 -
日拱一卒——LeetCode 763.划分字母区间
大家好呀,今天为大家带来的LeetCode的题目是LeetCode 763.划分字母区间。属于一道很不错的有关贪心算法加双指针的题目。题目分析由于同一字母只能出现在同一个片段,所以我们需要遍历整个字符串找出每个字符第一次出现的问题和最后一次出现的位置。解法一:滑动窗口(贪心算法+双指针)通过遍历找到每个字符出现的最开始位置和最后的位置后,就可以使用贪心算法+双指针来划分尽可能多的片段由于在划分的时候我们就能确定当前字符是什么以及位置,所以我们在第一次遍历的时候只需要记录下每个字符最后出现的位原创 2020-10-22 11:25:22 · 272 阅读 · 0 评论 -
日拱一卒——LeetCode 143.重排链表
大家好呀,今天为大家带来的LeetCode的题目是LeetCode 143.重排链表。题目分析由于需要实际的进行节点交换而不是单纯改变节点内部的值,所以需要我们按照规律找到每个节点的需要的后续节点,但是由于链表不支持下标访问,所以一种方法就是利用线性表来存储该链表。或者是先找到原链表的中点,然后将原链表右半段反转,然后将其合并。解法一:转为线性表思路较为简单,首先遍历该链表,将该链表的节点用线性表存储起来。然后再重排链表解法二:寻找链表中点、链表逆序、合并链表由于目标链表即为原链表的左半端和原创 2020-10-20 11:09:17 · 281 阅读 · 0 评论 -
日拱一卒——LeetCode 844.比较含退格的字符串
大家好呀,今天为大家带来的LeetCode的题目是LeetCode 844.比较含退格的字符串。算是一道比较基础的题目。题目分析这道题目相对简单,主要就是将时间复杂度和空间复杂度降低下来。解法一:重构字符串最简单的思路,就是按照题目的描述,将这两个字符串变为一般形式,然后直接比较是否相等即可。解法二:双指针由于一个字符是否存活要取决于后面是否有退格符,所以我们只需要要逆序遍历字符串,然后就可以得到一般字符串然后比较是否相等。代码实现解法一:public boolean backspac原创 2020-10-19 14:35:32 · 354 阅读 · 0 评论 -
日拱一卒——LeetCode 51.N皇后
大家好呀,今天是今天为大家带来的LeetCode的题目是LeetCode 51.N皇后问题,算是一道很经典的题目,也是一道难度不低的题目,但是只要我们掌握并理解了判断的逻辑,并且在代码编写上进行注意就能很好的解决问题。题目分析看到这个题目后,最简单的方法,当然就是暴力求解,依次遍历验证,但是这样会造成时间复杂度爆炸,所以我们要简化个过程,用程序来模拟我们思考的思路。由于一个皇后放下后,会对四条直线上的皇后有威胁,即这四条直线上不能有其他皇后存在,我们就可以利用Set集合来进行判断。每行原创 2020-10-17 14:28:42 · 300 阅读 · 0 评论 -
日拱一卒——LeetCode977.有序数组的平方
大家好呀,今天为大家带来的LeetCode的题目是:LeetCode977.有序数组的平方,这么一道简单题目,题目虽然简单,但是我们可以用几种不同的思路和方法来去实现它。重要的不是解决这个题目,而是学一些算法思想和思路。题目分析题目很简单,就算不是一个有序数组,我们可以先算出各个数的平方然后排序即可,但是我们没有使用到题目中有序这个条件,针对这个条件我们可以使用双指针来解决这个问题。解法一:直接排序这个方法相对来说比较无脑,就是将数据平方后进行排序解法二:双指针由于数组本身就存在有序,而且平原创 2020-10-16 11:35:47 · 275 阅读 · 0 评论 -
日拱一卒——LeetCode116.填充每个节点的下一个右侧节点指针
大家好呀,今天为大家带来的LeetCode的题目是:LeetCode116.填充每个节点的下一个右侧节点指针。属于一道关于二叉树的中等难度的题目。题目分析看完题目后看一下提示内容,一个是只能使用常量级的额外空间,一个是可以使用递归的方法来解决该题目。要是不通过提示的话,看完这个题目的第一反应的解法就是层次遍历,题目要求的是每一层都建立指针,那么我们只需要逐层遍历即可。通过提示我们知道还有第二种解法就是递归方法。解法一:层次遍历这种是最直观的,也是思维难度较低的一种算法,就是从根节点逐层遍历,在原创 2020-10-15 10:36:40 · 1094 阅读 · 7 评论 -
日拱一卒——Leetcode 1002.查找常用字符
大家好呀,今天为大家带来的LeetCode的题目是 leetcode 1002.查找常用字符,一道LeetCode上的简单题目。题目属于简单题,只需要在编写的过程中注意一些细节就没什么问题题目分析这道题目的核心就是计数,我们只需要维护一个数组,该数组记录这目前为止各个字母出现的最少次数,然后不停的往后遍历整个字符串数组,每遍历一个就更新这个数组,直到最后遍历完,再将其输出即可。解法一:计数通过上面的分析,我们只需要依次遍历这个字符串数组中的每个字符串,然后针对每个字符串去统计每个字母出现的次数,原创 2020-10-14 14:15:50 · 355 阅读 · 0 评论 -
日拱一卒——Leetcode 24.两两交换链表中的节点
大家好呀,今天为大家带来的LeetCode的题目是 leetcode 24.两两交换链表中的节点,做了几天简单题目了,终于来到一个中等难度的题目。但是看到这个题目发现,这不是个披着中等难度外衣的简单题目,题目的实质就是链表的反转。题目分析正如上面所分析的那样,这个题目要考察的点就是对于链表的掌握,其核心就是链表的反转。对于链表的反转我们可以使用两种方法,一种是递归一个是非递归即遍历。解法一:递归算法经过上面的分析我们可以很清楚的得知,我们要做的就是一步步的反转整个链表,递归的时候以两两为一组原创 2020-10-13 17:52:12 · 313 阅读 · 0 评论 -
日拱一卒——Leetcode 530.二叉搜索树的最小绝对差
大家好呀,今天为大家带来的LeetCode的题目是 leetcode 530、783两道关于二叉搜索树最小绝对差的题目,由于解法十分相似就合在一起进行分析。题目分析这个题目属于简单题目,思路也相对简单,首先最先想到的解决方法是将这个树转换为list,然后再去寻找这个list中的最小绝对值差,那么有了思路以后我们在着手对其进行优化。优化点:排序:去寻找list中最小绝对值差的时候,可以先将其排序,然后只需要寻找相邻的数据之间的即可。中序遍历:既然要获取一个有序的数据,而且是个二叉树,我们可以原创 2020-10-12 16:02:20 · 430 阅读 · 3 评论 -
日拱一卒——Leetcode 141.环形链表
目录题目分析解法一:快慢指针解法二:集合判重解法三:逐一删除解法四:先反转再比较代码实现解法一:快慢指针解法二:集合判重解法三:逐一删除解法四:先反转后比较142.环形链表2最后 大家好呀,今天为大家带来的LeetCode的题目是 leetcode 141、142两道关于环形链表的题目,由于解法十分相似就合在一起进行分析。题目分析这个题目很简单,就是判断链表是否有环,算是在算法领域中属于入门较为初级的题目。对于这种判断链表是否有环,我们通常有一下四种方法:快慢指针:集合判重:逐一删除:原创 2020-10-10 13:35:50 · 368 阅读 · 0 评论 -
LeetCode152.乘积最大子数列
LeetCode152.乘积最大子数列题目分析 题目中有几个关键点:整数数组:意味着没有小数,不考虑0的情况下相乘的的绝对值肯定是变大或者不变的。 但是由于存在负数,导致最大值可能从正的产生也可能从负的产生,所以就需要在遍历的时候都进行记录。动态规划:这个问题需要我们遍历数组时计算当前的最大值,并不断更新由于上面的分析我们可以得知最大值肯定是前面的值乘以当前值或者就是当前值可以得知这样的状态转移方程:imax=max(imax*nums[i],nums[i])原创 2020-05-19 18:14:46 · 398 阅读 · 0 评论 -
思维私塾——LeetCode16.最接近的三数之和
目录LeetCode16.最接近的三数之和题目:分析只找一个数找两个数的和找三个数的和代码实现最后LeetCode16.最接近的三数之和 各位朋友们大家好呀,我是你的老朋友冢狐,今天我们来看一道LeetCode上的中等难度的题目——最接近的三数之和问题。希望看完这篇文章后能给各位带来一些收获。题目: 首先我们先来看一下题目的描述:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J1j4JLzT-1593154112609)(https://raw.githubus原创 2020-06-26 14:50:16 · 360 阅读 · 0 评论 -
四种方法花式吊打面试题目——最小k个数
最小K个数算法题目: 输入一个整数数组arr,找出其中最小的k个数。思路 比较直观的想法就是将整个数组排序,然后输出前K小的数,所以我们使用目前最高效的排序算法,快排来解决问题。所以所需的时间复杂度O(nlogn)。但是由于取前K个数所以快排不用完全执行。快排思想 直接通过快排切分好第K小的数(下标k-1)大根堆(前K小)/小根堆(前K大)因为java中有现成的PriorityQueue,实现起来简单O(NlogK) 是因为求前k小,所以用一个容量为K的大根堆,每次pol原创 2020-06-12 14:57:05 · 1092 阅读 · 0 评论 -
LeetCode287.寻找重复数
涉及到的算法:哈希表判重、二分查找、快慢指针抽屉原理以及【Floy判圈算法】原创 2020-05-26 15:37:43 · 567 阅读 · 2 评论 -
LeetCode146.LRU缓存机制
LeetCode146.LRU缓存机制题目思路分析 要实现本体的两种操作,需要用到一个哈希表和一个双向链表。方法:哈希表+双向链表 LRU缓存机制可以通过哈希表辅以双向链表实现。首先先用一个哈希表和一个双向链表维护所有在缓存中的键值对双向链表按照被使用的顺序存储这些键值对,靠近头部的是最近使用的哈希表,通过魂村数据的键值对映射到其在双向链表中的位置 首先使用哈希表进行定位,找出缓存在双向链表中的位置,然后将其移动到头部。对于get操作,首先判断key是否存在如果不存原创 2020-05-25 22:46:00 · 351 阅读 · 0 评论 -
LeetCode5.最长回文子串
LeetCode5.最长回文子串问题分析解法一:中心扩散法顾名思义就是每一个位置中心去扩散,去找回文串,遇到不是回文串的时候结束。寻找方法就是首先先找其左边和右边位置,如果相等即继续走,只到走到左边的值和右边的值都不和中间元素相等,然后判断左右值是否相等。解法二:动态规划 回看中心扩展算法,其实中间做了很多重复的计算,而动态规划就是为了减少重复计算的问题。即以空间换时间,将计算结果暂时存放起来,以避免重复计算使用boolean dp[l] [r]表示字符串l到r这段是否是回文串,如果原创 2020-05-23 19:13:18 · 2235 阅读 · 1 评论 -
LeetCode76.最小覆盖子串
LeetCode76.最小覆盖子串问题解题思路滑动窗口: 主要的使用技巧就是维护一个窗口,从开始到末尾不断的滑动,然后更新长度。/* 滑动窗口算法框架 */void slidingWindow(string s, string t) { unordered_map<char, int> need, window; for (char c : t) need[c]++; int left = 0, right = 0; int valid原创 2020-05-23 15:59:20 · 485 阅读 · 0 评论 -
LeetCode1371每个云音包括偶数次的最长字字符串
目录LeetCode1371.每个元音包括偶数次的最长子字符串题目分析错误示范:正解:代码实现LeetCode1371.每个元音包括偶数次的最长子字符串题目分析错误示范: 首先我先想到的思路就是先把整个字符串遍历一遍,找出所有的元音字母的奇偶数,然后分别从首尾进行遍历删除元素为奇数的元素,但是会造成把原本是偶数对的元音给删成奇数对。所以不行正解:首先对于五个元音的处理,因为每个元音的奇偶数只有两种状态,要么奇要么偶,所以可以使用01来进行区分,然后一共五位,所以维护一个五位数的二进制数来原创 2020-05-21 20:29:50 · 627 阅读 · 0 评论 -
LeetCode解题合集
LeetCode解题合集 从今天开始准备每天解决至少一道LeetCode上面的题目,正好官网也有LeetCode的每日一题的活动。正好。LeetCode152.乘积最大子数列LeetCode53.最大子序和LeetCode680.验证会问字符串ⅡLeetCode1LeetCode1LeetCode1LeetCode1LeetCode1LeetCode1LeetCode1LeetCode1LeetCode1LeetCode1LeetCode1LeetCode1LeetCod原创 2020-05-19 21:31:44 · 474 阅读 · 0 评论 -
LeetCode680.验证回文字符串Ⅱ
目录LeetCode680.验证会问字符串Ⅱ问题分析代码实现LeetCode680.验证会问字符串Ⅱ问题分析这个题目就是对于回文串的条件进行了放宽,允许删除一个元素,这样会导致字符之间的对应关系发生变化,相对简单的方法就是定义两个指针,分别从头部或者尾部进行遍历,直到两者汇合,如果发生不相等的情况,无非就是两种,要么删除头部的要么删除尾部的,最后只要有一个能形成一个回文串即可。代码实现public boolean validPalindrome(String s) { int原创 2020-05-19 21:30:02 · 476 阅读 · 0 评论 -
LeetCode53.最大子序和
目录LeetCode53.最大子序和题目分析代码实现解法一:动态规划解法二:分治法LeetCode53.最大子序和题目分析 这个属于动态规划中比较简单的问题,只需要明确状态转移方程imax=max{imax+nums[i],nums[i]}然后正常求解即可问题在于进阶中的尝试使用分治法来求解。分治法,问题划分成子问题,再合并连续子串的划分:左半边子串右半边子串横跨中间值的任意子串初步代码if(length==1){ return nums[0];}原创 2020-05-19 20:10:16 · 479 阅读 · 0 评论