
LeetCode
快乐的小J
基础不牢,地动山摇。
展开
-
【LeetCode 23】合并K个升序链表
题目描述:存在k个有序链表,实现多路归并。思路:与二路归并类似,需要每次从所有头结点挑选最小的连接到结果链表;二路归并直接比较两个链表的头即可,但是K路的话,每次需要比较K个,使用堆或者红黑树会比较好维护,采用PriorityQueue或者TreeSet。 public ListNode mergeKLists(ListNode[] lists) { if(lists==null||lists.length==0){ return null;原创 2020-09-03 15:09:19 · 226 阅读 · 0 评论 -
【LeetCode 406】根据身高重建队列
思路:来自力扣官方(因为没看懂题目,所以...直接看了答案)【https://leetcode-cn.com/problems/queue-reconstruction-by-height/solution/gen-ju-shen-gao-zhong-jian-dui-lie-by-leetcode/】(1)对于两个人i和j,如果i的身高大于j的身高,那么j的站位对于i是没有任何影响的...原创 2020-03-27 17:49:51 · 364 阅读 · 0 评论 -
【LeetCode 148】 排序链表
题目要求:在O(nlogn)的时间复杂度与常数空间复杂度对链表排序。思路:归并排序。相关问题:如何快速确定链表的中间结点。 public ListNode sortList(ListNode head) { if(head==null||head.next==null) return head; //快慢指针拆分为两个链表 //...原创 2020-03-27 16:01:28 · 115 阅读 · 0 评论 -
【LeetCode 105】从前序与中序遍历序列构造二叉树
思路:观察发现,首先从preorder获得根结点,从inorder找到根结点所在位置index,inorder[i]之前的内容为左子树,之后的内容为右子树。 public TreeNode buildTree(int[] preorder, int[] inorder) { TreeNode root=buildTreeCore(preorder, 0, preorder...原创 2020-03-27 15:24:28 · 113 阅读 · 0 评论 -
【LeetCode 64】 最小路径和
思路:1. 简单递归,时间复杂度较高,因为会重复计算。 public int minPathSum(int[][] grid) { int n=grid.length; int m=grid[0].length; return minPathSumCore(grid,n,m,0,0); } ...原创 2020-03-22 21:30:10 · 231 阅读 · 0 评论 -
【LeetCode 96】不同的二叉搜索树
思路:动态规划。依次选择每一个元素作为根结点,假如选择第i个元素作为根结点,树的可能数量=(i-1)个元素构成左侧搜索树的数量*(n-i)个元素构成的右侧搜索树的数量。因为二叉搜索树的构成仅与元素的大小有关系,所以{1,2,3}与{4,5,6}构成的二叉搜索树的数量是一样的,因此中间结果可重用。 public int numTrees(int n) { int[...原创 2020-03-22 17:17:44 · 285 阅读 · 0 评论 -
【LeetCode 136】只出现一次的数字
简单题目,采用异或,直接上代码: public int singleNumber(int[] nums) { if(nums==null||nums.length==0) return 0; int answer=nums[0]; for(int i=1;i<nums.length;i++){ answer...原创 2020-03-22 15:50:38 · 115 阅读 · 0 评论 -
【LeetCode 238】除自身以外数组的乘积
思路:求解除自身以外的所有数字的乘积,就是求解自身左侧的乘积与右侧乘积的乘积,可以分为两个子问题:自左向右求解累乘结果;自右向左求解累乘结果。已经计算的结果可以重复使用。代码如下: public int[] productExceptSelf(int[] nums) { if (nums == null || nums.length == 0) { ...原创 2020-03-22 15:47:06 · 108 阅读 · 0 评论 -
【LeetCode 48】 旋转图像
思路:转置+镜像 public void rotate(int[][] matrix) { if(matrix==null) return; int n=matrix.length; //转置 for(int i=0;i<n;i++){ for(int j=i;j<n;j++){ ...原创 2020-03-22 15:08:59 · 131 阅读 · 0 评论 -
【LeetCode 114】二叉树展开为链表
思路:通过观察可以发现,所谓展开就是按照前序遍历将二叉树重新连接,使用递归。首先记录root的右子树;对root的左子树递归展开,并返回根节点,连接到root的右边;对root的右子树递归展开,连接到当前链表的末尾。 public void flatten(TreeNode root) { flattenCore(root); } pu...原创 2020-03-22 14:40:46 · 446 阅读 · 0 评论 -
【LeetCode 206】翻转链表
1. 循环写法 public ListNode reverseList(ListNode head) { if(head==null||head.next==null) return head; ListNode p1=head,p2=head.next,p3=p2.next; head.next=null; whi...原创 2020-03-21 23:23:41 · 111 阅读 · 0 评论 -
【LeetCode 39】组合总和
极为经典的回溯题目思路:套用模板即可,需要说明的是:1. 循环的起点,元素可以重用,并且不允许答案重复,起点选择当前元素。2. 终止条件:当target等于0,那么就存在一组解;如果target不为0,需要判断target与可用元素最小值(就是当前元素),判断是否还可能出现解,不可能就进行剪枝,已经包括了target被减为负值的情况。 public List<Li...原创 2020-03-21 22:42:08 · 103 阅读 · 0 评论 -
【LeetCode 94】使用迭代返回二叉树的中序遍历结果
常用递归问题的非递归算法,常常使用栈书写。第一种:使用栈的非递归中序遍历算法思路:中序遍历的直观理解。入栈操作:跟结点出发,将left结点不断添加到栈,到达最后一个结点之后,开始执行出栈操作;出栈操作:检查栈顶结点是否存在右子树,如果不存在,直接将当前结点弹出并且记录结果;如果存在右子树,在弹出当前结点之后,需要将右子树入栈。 public List<Inte...原创 2020-03-21 21:56:42 · 145 阅读 · 0 评论 -
【LeetCode 104】二叉树的最大深度
简单题目,代码如下:import java.lang.Math;class Solution { public int maxDepth(TreeNode root) { if(root==null) return 0; return 1+Math.max(maxDepth(root.left),maxDepth(root.right)); ...原创 2020-03-21 15:40:45 · 80 阅读 · 0 评论 -
【LeetCode 22】括号生成
深搜+剪枝的两种解法:1. 自上而下的深搜遍历与检查,一开始持有n个左括号与n个右括号,每次选择向路径中加入左括号或右括号,当某一种括号剩余量为0剪枝。对可能的结果使用栈检查合法性。效率比较低下,因为检查的过程耗费时间。 public List<String> generateParenthesis(int n) { List<String...原创 2020-03-21 15:22:41 · 112 阅读 · 0 评论 -
【LeetCode 226】翻转二叉树
题目简单,直接上代码。 public TreeNode invertTree(TreeNode root) { if(root==null||(root.left==null&&root.right==null)){ return root; } TreeNode tmp=root...原创 2020-03-20 22:28:09 · 102 阅读 · 0 评论 -
【LeetCode 338】比特位计数
这是一个动态规划题目,主要思路就是利用已经计算的结果获得当前求解的结果,递推式通常通过反推获得。方法1:获得一个比当前数字小的数字,最简单的方法就是右移。查阅(当前数字>>2)的结果,如果当前数字是偶数,直接返回,如果当前数字是奇数,需要加上最低位的一个1。方法2:通过列举的方法寻找规律。...010001100100011101001000...原创 2020-03-19 22:51:01 · 104 阅读 · 0 评论 -
【LeetCode 461】汉明距离
思路:简单题目,一笔带过。异或然后循环数1的数量。 public int hammingDistance(int x, int y) { int answer=0; int XorAnswer=x^y; int point=1; for(int i=0;i<32;i++){ ...原创 2020-03-19 12:04:13 · 82 阅读 · 0 评论 -
【LeetCode 78】子集
第一种:回溯解法 public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> answer=new ArrayList<>(); if (nums == null || nums.length == 0) { ...原创 2020-03-19 11:11:18 · 127 阅读 · 0 评论 -
【LeetCode19】删除链表的倒数第N个节点
思路:双指针,搞定。注意:需要判断几种特殊情况,主要考察细节。详见代码。 public ListNode removeNthFromEnd(ListNode head, int n) { if(head==null) return null; //三个指针,因为涉及删除操作 ListNode pointer0=head,point...原创 2019-12-09 15:40:54 · 104 阅读 · 0 评论 -
【LeetCode17】电话号码的字母组合
思路:采用递归思想,穷举即可。写法有很多种,比如从第一个数字的每一种取值,递归剩下字符串答案,拼接即可。 public List<String> letterCombinations(String digits) { if(digits==null||digits.length()==0) return new ArrayList<>();...原创 2019-12-07 17:34:45 · 110 阅读 · 0 评论 -
【LeetCode15】三数之和
思路:这道题目有两数之和衍生,只需要在两数之和的外部套上一层O(n)的循环即可。重点:乱序数组两数之和的思路有两种,复杂度都是O(nlogn):(1)排序,对每一个元素使用二分查找的方式寻找它的另一半,复杂度O(nlogn+n*logn);(2)排序,使用双指针,分别指向前段与尾端,比较当前和与目标值的大小,移动指针,复杂度O(nlogn+n);第二种是需要重点记住的,如果给的...原创 2019-12-06 12:42:18 · 171 阅读 · 0 评论 -
【LeetCode11】盛最多水的容器
思路:(来自题解)使用双指针,分别指向数组头和数组尾,计算当前面积后,移动较短的边的下标,必然会遍历到最优解。【https://leetcode-cn.com/problems/container-with-most-water/solution/container-with-most-water-shuang-zhi-zhen-fa-yi-do/】的证明比较清晰,移动短指针必然不会错过最...原创 2019-12-06 10:30:23 · 132 阅读 · 0 评论 -
【LeetCode10】正则表达式匹配
思路:列出所有的分支情况,然后编写:(1)S结束,P经过处理(末尾如果剩下类似a*b*直接处理掉)也结束,true;(2)S结束,P经过处理没有结束,false;(3)S未结束,P结束,false;(4)S未结束,P未结束: 1)S当前字符与P当前字符匹配: a. P下一个字符是'*',可能的移动方式有三种:S不移动,P移动两位...原创 2019-12-05 21:17:38 · 105 阅读 · 0 评论 -
【LeetCode647】回文子串
思路:采用动态规划或中心扩展方法都可以,【LeetCode5】已经使用了中心扩展法,这里采用动态规划。设置矩阵f,f[i][j]表示字符串中下标从i到j的子串是否为回文,获得f之后,只需要遍历二维矩阵统计value为true的元素。动态规划的公式如下: public int countSubstrings(String s) { if(s==null||s...原创 2019-12-05 19:59:37 · 101 阅读 · 0 评论 -
【LeetCode5】最长回文子串
思路:(1)中心扩展法,以每一个字符或者间隔为中心,向两侧扩展,记录最长的回文子串即可。时间复杂度为O((2*n+1)*n/2),即O(n^2)。(2)另一种方法就是动态规划,【LeetCode647】已经实现,时间复杂度同样为O(n^2)。(3)还有一种是“马拉车”方法,据说可以将时间复杂度降到O(n),基于中心扩展法,省去了一些重复的操作,很巧妙。这里使用中心扩展法。...原创 2019-12-05 19:50:32 · 93 阅读 · 0 评论 -
【LeetCode4】寻找两个有序数组的中位数
思路1:将两个数组按照索引i与索引j切分为左右两个部分,左半部分与右半部分的元素数量相同,并且寻找到左半部分最大值小于右半部分最小值的位置,中位数就在附近,具体的根据总长度是偶数/奇数确定。寻找索引的过程为二分。时间复杂度为O(logmin(shortLength,longLength))【https://leetcode-cn.com/problems/median-of-two-sor...原创 2019-12-05 15:18:55 · 189 阅读 · 0 评论 -
【LeetCode581】最短无序连续子数组
思路1:题目的意思是,将数组排序之后,有哪一些元素不会变动位置,因此比较直接的一种思路就是将数组排序,然后比较数组前段与后段相同的元素有哪些,统计即可。时间复杂度为O(nlogn),为了不改变原数组,需要另辟空间,空间复杂度为O(n)。思路2:事实上,并不需要真的对数组进行排序,观察有以下结论:(1)从前向后元素应该是递增,即第i个元素应该是第0个元素~第i个元素的最大值,否则第i个元素递...原创 2019-12-05 10:36:11 · 205 阅读 · 0 评论 -
【LeetCode】3无重复字符的最长子串
思路:使用双向队列。遍历字符串,如果队列不包含当前字符,则将该字符添加到队列末尾;如果队列已经包含了当前字符,首先记录当前队列长度,然后将队列该字符之前的所有字符全部弹出,然后将当前字符添加到队列末尾,维持队列不出现重复的字符。 public int lengthOfLongestSubstring(String s) { if(s==null||s.length(...原创 2019-11-19 21:20:01 · 125 阅读 · 0 评论 -
【LeetCode】279完全平方数
思路:动态规划,最初想到的公式是:后来提交之后报出超时错误,因此参考了题解,找到正确的公式为:第二个公式直接计算“前段”为平方数的情况,比起第一个公式,时间复杂度从n^2降低到n^1.5;因此,仅仅写出动态规划的公式是不够的,需要保证:(1)公式的正确性;(2)公式的高效性,此一条跟题目有关。详细分析题目中可以用来降低时间复杂度的题点,吃一堑长一智~。...原创 2019-11-19 20:26:06 · 277 阅读 · 0 评论 -
【LeetCode】617合并二叉树
思路:递归。 public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { if(t1==null&&t2==null) return null; TreeNode t3=new TreeNode((t1==null?0:t1.val)+(t2==null?0:t2.v...原创 2019-11-15 16:04:17 · 80 阅读 · 0 评论 -
【LeetCode】621任务调度器
思路:借鉴自题解。借鉴“轮”的想法,每轮执行n+1次,每一轮对任务的次数排序,选择n+1个不同的任务执行,不足补空。最后一轮需要注意执行结束之后不需要补空,所以维持一个剩余任务数量total,一旦total为0,立刻终止。public int leastInterval(char[] tasks, int n) { if(tasks==null||tasks.length...原创 2019-11-15 15:42:01 · 150 阅读 · 1 评论 -
【LeetCode】739每日温度
思路:构建温度与下标的键值对(pair<温度,下标>)的栈,从i=0的温度开始压栈,如果新入栈的温度高于栈顶温度,则栈顶元素出栈,并且为该元素对应下标的answer设置为(i-栈顶元素下标)。public int[] dailyTemperatures(int[] T) { if(T==null||T.length==0) return new int[0];...原创 2019-11-14 20:40:27 · 103 阅读 · 0 评论 -
【LeetCode】两数相加
题目描述:备注:这题比较出错的是,两个链表不一定等长这个条件没有说明,并且根据链表的特性是不存在溢出的,因此计算完成之后需要检查进位carry是否还有值,有的话在末尾追加一个1结点。解题思路:很简单,l1+l2+carry,如果有进位就保留进位carry,进入下一位计算。public ListNode addTwoNumbers(ListNode l1, ListNode l2)...原创 2019-10-26 19:03:20 · 100 阅读 · 0 评论 -
【LeetCode】两数之和
题目描述:写在前面的题外话:今天第一天开始做leetcode,本想直接跳过简单类型的题目。但是实际做完第一题并且看了评论区的题解,才发现自身的思维太过局限。简单的题目一样可以蕴含大量干货。最简单的思路:暴力法,两遍循环。时间复杂度O(n^2)。自己的思路:一遍循环,对每一个循环到的数字二分查找它的另一半。时间复杂度O(n^log(n)),空间复杂度O(n),因为需要另建...原创 2019-10-26 18:10:25 · 209 阅读 · 0 评论