
LeetCode刷题
刷刷刷
Jackeys007
开朗、活泼,一个逗比的程序员
展开
-
二叉树的直径
543.二叉树的直径 题解:其实就是一个递归求二叉树高度的题目,思路很简单,求出左右子树的最大高度,相加,取个最大值即可。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val;原创 2021-10-04 11:20:51 · 94 阅读 · 0 评论 -
缺失的第一个正数
41.缺失的第一个正数 题解:原地hash法,解读题意我们可以知道,最小的正整数肯定出现在[1,n+1]之间,为什么这么说?假设1,2,3,4,5连续的5个数,我们可以知道最小的肯定是6,但如果是不连续的,那肯定最小的就是序列中缺失的那个。那么我们的思路就是如果出现了非正整数,那么我们令非正整数等于n+1(只要是大于n的数都行),这样将它排除在外。如果是x正数,我们就将其标记为已出现,具体做法就是将nums[x-1]标记为负数 (nums[x-1]=-Math.abs(nums[x-1])),利用绝对值避免原创 2021-10-03 19:43:03 · 141 阅读 · 0 评论 -
复原IP地址
93.复原ip地址 题解:dfs+剪枝,使用一个集合path用来存储每次放入的满足条件的字符串,首先判断字符串的长度,如果大于12或者小于4直接返回一个空的集合。 深度搜索过程中,出口是当满足条件的分段数量达到4并且字符串全部遍历完 的时候,就可以把path放入到我们的集合当中。用一个长度为3的循环进行 剪枝,判断当前字符串是否满足条件,将我们的字符串放入到我们的path中,然后进一步深度搜索,注意要回溯。 class Solution { private int len; private原创 2021-10-03 18:14:04 · 218 阅读 · 0 评论 -
用Rand7()实现Rand10()
470.用Rand7()实现Rand10() 题解:我第一次做的时候是直接rand7() * rand7()%10+1,但是只对了8组数据,不知道为什么,改成 (rand7()+(rand7()-1) * 7)%10+1,就对了10组数据,后面直接根据两组相乘生成的结果值,剔除大于40的那部分数据,最后进行返回就行了。 class Solution extends SolBase { public int rand10() { int x=rand7();原创 2021-09-20 11:35:35 · 185 阅读 · 0 评论 -
最长公共子序列
1143.最长公共子序列 题解:典型动态规划,dp[i][j]代表的是,text1索引0-i与text2索引0-j匹配的公共子序列的最大长度,我们可以知道动态转移方程就是: if text1[i]==text2[j] dp[i][j]=dp[i-1][j-1]+1 //(匹配,则长度再加一) else dp[i][j]=max(dp[i-1][j],dp[i][j-1]) //(不匹配,则考虑消除一个字符,取长度最大) 至于为什么是消除其中一个字符,举个栗子:现有text1=“ace”,text2=“原创 2021-09-20 10:50:39 · 100 阅读 · 0 评论 -
编辑距离
72.编辑距离 题解:这道题目是一个动态规划的题目,对于word1和word2,dp[i][j]代表的是,word1从0到i的字符串与word2从0到j的字符串实现相等的进行的最少操作数,总共分为三个操作: 在word1中索引为i的位置插入word2[j]字符; 删除word1中索引为i的字符; 将word1中索引为i的字符修改为word2[j]。 综上所述: dp[i-1][j]代表的就是插入 dp[i][j-1]代表的就是删除 dp[i-1][j-1]代表的就是修改 因此为了求出最少次数,我们就原创 2021-09-19 10:42:38 · 105 阅读 · 0 评论 -
滑动窗口最大值
239.滑动窗口最大值 题解:第一种方法是自己写的,模拟窗口的过程,但是超时了。 第二种方法参考的是官方的题解,其实就是利用一个双端队列,将每个窗口的最大值的索引从后面存入队列中,同时将较小的值淘汰掉,并且需要判断值是否存在窗口中,这也是我们为什么存的是索引而不是值的原因。 //第一种 class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int len=nums.length; int原创 2021-09-18 15:08:54 · 122 阅读 · 0 评论 -
最小覆盖子串
76.最小覆盖子串 题解:滑动窗口,利用窗口的边界left和right,如果窗口含有子串,取最小值,然后left右移动,否则将元素加入到窗口中,right右移。提前判断子串长度大于父串,直接返回。 class Solution { //存储滑动窗口字符 private Map<Character, Integer> tMap = new HashMap<>(); //存储t中的字符 private Map<Character, Integer>原创 2021-09-17 11:50:45 · 115 阅读 · 0 评论 -
寻找两个有序数组的中位数
4.寻找两个有序数组的中位数 题解:首先两个数组是正序,那么我们可以用一个数组merge存储值,通过归并,将小的先进数组merge,大的后进merge,在归并之后,还得考虑是否所有的数都归并完成,因此还需要判断,将没有归并的值直接放入merge即可,最后通过奇偶判断中位数的位置。 class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int nums1Len = nums1.原创 2021-09-15 09:36:39 · 138 阅读 · 0 评论 -
路径总和 II
113. 路径总和 II 题解:先存储路径上的节点,通过递归到最底层,通过条件判断是否是叶节点以及是否满足target值,如果满足条件,则将集合存入到ansList中,切记此处不可直接返回,必须经过回溯。 class Solution { private Deque<Integer> nodeDequeue=new LinkedList<>(); public List<List<Integer>> pathSum(TreeNode root,原创 2021-09-14 09:59:26 · 90 阅读 · 0 评论 -
平衡二叉树
110. 平衡二叉树 题解:这道题目我走了一个误区,我以为的是平衡二叉树是只要保证根节点的左右子树高度之差在<=1,但是平衡二叉树是每个节点的左右子树高度之差都保证在<=1。所以我们的思路就是先递归每个节点,求出其左右子树的高度之差,如果不符合,则返回一个-1,表示此树已经不符合平衡二叉树,如果符合 则返回此节点的高度。 class Solution { public boolean isBalanced(TreeNode root) { return getHeight原创 2021-09-14 08:58:55 · 71 阅读 · 0 评论 -
链表的归并排序
链表排序 题解:根据快慢指针取到链表中点的结点,然后一直递归二分,二分完之后,进行合并,合并的时候 小的放前面,大的放后面,最后需要判断一下有没有合并完成,有可能是左边合并完了,右边还有没合 并的,类似这样,判断一下,最后接上就好了。 class Solution { public ListNode sortList(ListNode head) { return mergeSort(head); } public ListNode mergeSort(ListNo原创 2021-09-13 19:55:20 · 263 阅读 · 0 评论 -
下一个排列
31. 下一个排列 题解:这道题目本来想暴力出所有序列,然后遍历一遍。但是题意是从原来的基础上改,因此我们可以采取 从后往前找出第一个前一个小于于后一个的数x,再从后往前找出第一个大于x的数y,然后x与y交换,这样 之后,x+1->len-1之间的数都是降序排列,为了让数尽可能小,我们只需要将x+1->len-1之间的数按照升 序排列就行了,由于已经降序,所以我们只需要从中间分开,交换就行了。至于为什么从后往前面找,因为 越往前改变的值就越大,由于是求小的,所以从后往前找能使值的变化最小。 */原创 2021-09-13 09:46:43 · 64 阅读 · 0 评论