![](https://img-blog.csdnimg.cn/20190927151132530.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode
LeetCode之路
高一少年
Things will come your way
展开
-
0-1背包
文章目录题目分析Solution - 二维数组Solution - 一维数组变式题 - 恰好装满Solution题目分析假设dp(i,j)是最大承重为j、有前i件物品可选时的最大总价值,i∈[1,n],j∈[1,W]dp(i,0)、dp(0,j)初始值均为0如果j< weights[i-1],那么dp(i,j)=dp(i-1,j)如果j≥ weights[i-1],那么dp(i...原创 2020-05-20 19:03:40 · 155 阅读 · 0 评论 -
42.接雨水
42.接雨水文章目录题目分析Solution题目分析Solution /** * 空间复杂度O(1),时间复杂度O(n) */ public int trap(int[] height) { if (height == null || height.length == 0) return 0; int lastIdx = height.length - 2; // 遍历每一根柱子,看看每一根柱子上能放多少水原创 2020-05-14 17:21:25 · 129 阅读 · 0 评论 -
11.盛最多水的容器
11.盛最多水的容器文章目录题目分析Solution题目分析暴力法:枚举可能的两个柱子,但是会有较多的无效计算优化Solution public int maxArea(int[] height) { if (height == null || height.length == 0) return 0; int l = 0, r = height.length - 1, water = 0; while (l < r) {原创 2020-05-14 16:21:26 · 100 阅读 · 0 评论 -
253.会议室II
253.会议室II文章目录题目分析Solution - 最小堆Solution - 分开排序题目分析按照常识,要根据开始时间来排序,先开的排在前面前面有会议开完,则可以利用该会议室;否则,要新开一间会议室Solution - 最小堆最小堆,取最小值:O(1);插入,删除:O(logn)堆顶:最早开的会的结束时间,这样要开的会的开始时间和最早结束的会议的结束时间比较最后堆中,剩下的元素个数为所需要的会议室,即没有在要开的会了public int minMeetingRooms(in原创 2020-05-13 22:36:12 · 322 阅读 · 0 评论 -
7.整数反转
7.整数反转文章目录题目分析Solution题目分析假设最大值就为2789,那它反转之后为9872,一定会溢出b = a * 10 + x % 10 ; (b - x % 10) / 10 = a,反推a,能相等说明没有溢出,因为溢出数字就一定会变得不同Solution public int reverse1(int x) { long res = 0; while (x != 0) { res = res * 10 + x %原创 2020-05-13 22:16:01 · 86 阅读 · 0 评论 -
146.LRU缓存机制
146.LRU缓存机制文章目录题目分析Solution题目分析LRU是操作系统常用的一种页面置换算法,选择最近最久未使用的页面予以淘汰虚拟头尾节点哈希表+双向链表Solutionpublic class LRUCache { private Map<Integer, Node> map; private int capacity; // 虚拟头结点 private Node first; // 虚拟尾结点 private Nod原创 2020-05-13 22:03:17 · 150 阅读 · 0 评论 -
54.螺旋矩阵
54.螺旋矩阵文章目录题目分析Solution题目分析先加最外一圈,一层一层向内,利用四个指针来确定处在哪一圈矩阵分为偶数行和奇数行两种情况奇数行、偶数列的时候有问题,当添加完left top -> right top,top++之后,top越过bottom但是第二步right top -> right bottom不会执行,right–但是第三步right bottom -> left bottom会在执行一次,所以要breakSolution publi原创 2020-05-13 21:44:31 · 194 阅读 · 0 评论 -
面试题.62.圆圈中最后剩下的数字
面试题.62.圆圈中最后剩下的数字文章目录题目分析Solution题目分析约瑟夫环问题f(n, m) = (f(n – 1, m) + m) % n如果编号从1开始,即结果+1,向后一个Solution public int lastRemaining1(int n, int m) { return (n == 1) ? 0 : (lastRemaining1(n - 1, m) + m) % n; } // f(1, 3) = 0 //原创 2020-05-13 21:24:56 · 115 阅读 · 0 评论 -
50.Pow
50.Pow文章目录Solution - 递归Solution - 非递归变式题 - 快速幂的模Solution - 递归这里注意-1右移,-1 = 1111 1111,右移仍然是 1111 1111 = -1320 = 310 * 310 ; 321 = 310 * 310 * 33-20 = 3-10 * 3-10 ; 3-20 = 3-11 * 3-11 * 3 负奇数,右移相当于绝对值向上取整, 指数 -7 >> 1 == -4 * -4 * 4 // T(n) =原创 2020-05-13 21:14:11 · 92 阅读 · 0 评论 -
15.三数之和
15.三数之和文章目录题目分析Solution题目分析去重:由于是经过排序的,那么相等的一定是挨在一起的,2位置的-1,他只向他后面找能组合成功的数,但是1位置的-1已经找过了,并且1位置,他找的范围还要更大,也就是2位置时其实是可以跳过的l,r 如果扫描到和前一次的元素相等,即重复情况就要跳过Solution public List<List<Integer>> threeSum(int[] nums) { if (nums == null原创 2020-05-13 18:30:20 · 105 阅读 · 0 评论 -
1.两数之和
1.两数之和文章目录题目分析Solution题目分析暴力法枚举每一对相加之和,时间复杂度:O(n2)要求O(n),即扫描到一个就能花O(1)时间找到另一个加数,即用哈希表HashMap的key为数,value为下标,如果找到即返回,找不到,就把自己加进去作为另一个加数Solution public int[] twoSum(int[] nums, int target) { if (nums == null) return null; // 用来存放原创 2020-05-13 18:06:10 · 109 阅读 · 0 评论 -
283.移动零
283.移动零文章目录题目分析Solution题目分析不能考虑遇到0直接和数组末尾交换,这样会破环相对顺序反过来想,把0移动到数组末 == 把非0移动到前面一趟扫描,遇到0就跳过,遇到非0就把它挪到前面去cur记录着可以挪动到的位置注意当nums[i] != 0,且cur和i指向同位置,即非0数看作已经放好位置了Solution public void moveZeroes(int[] nums) { if (nums == null) return;原创 2020-05-13 17:56:30 · 91 阅读 · 0 评论 -
39.组合总和
39.组合总和文章目录题目分析Solution题目分析排序可以保证选择的数字,当超过remain时,一定凑不出,可以提前结束dfs的退出条件显然为凑过targetSolutionclass Solution { public List<List<Integer>> combinationSum(int[] candidates, int target) { if (candidates == null || candidates.length原创 2020-05-08 22:29:07 · 107 阅读 · 0 评论 -
113.路径总和Ⅱ
113.路径总和Ⅱ文章目录题目分析Solution题目分析此题dfs终止的条件是,到达叶子节点,但是找到节点的条件还要是remain为0Solutionclass Solution { public List<List<Integer>> pathSum(TreeNode root, int sum) { List<List<Integer>> list = new ArrayList<>();原创 2020-05-08 22:05:44 · 100 阅读 · 0 评论 -
22.括号生成
22.括号生成文章目录题目分析Solution题目分析这个题就不是直接明显的告诉层数,那么一定有2n个括号可以选择比较特殊的是 ‘(’,一开始只能选择 ’(‘ ,并且此时’(‘可选的数量和’)'数量相同如下图,此时剩余’(‘可选的数量和’)‘数量都为1,只可选择’(’为了记录剩余’(‘和’)'的数量,每次都要判断leftRemain和rightRemain由于加入的’(‘还是’)'是有条件的,那么就不好用for循环,对左右括号分别判断即可Solutionpublic List<原创 2020-05-08 21:49:43 · 100 阅读 · 0 评论 -
47.全排列Ⅱ
47.全排列Ⅱ文章目录题目分析Solution题目分析首先这个题和46.全排列不同于给的nums可能会有重复数字,这就导致产生的全排列会相同比如[1,1,2]和 [1,3,2]这样1会替换3,导致出现相同的去重:第0层的第2,4,5其实是一样的,虽然后面不一样,但是最终全排列,后面的出现的情况最终还是一样1位置和3,4位置交换时,由于前面已经和1交换过了,那么就会重复Solution public List<List<Integer>> permuteU原创 2020-05-08 21:34:36 · 118 阅读 · 0 评论 -
46.全排列
46.全排列文章目录题目分析SolutionSolution 2题目分析dfs 需要一层一层地来,画一个竖的表格记录每一层干什么;记录结束时的条件注意用过的就不能再选了,所以要记录每次要添加的列表,判断如果要加入的元素已经在其中,就直接跳过当添加完一种情况后,注意把记录使用过的,在标记为没用过Solution private List<List<Integer>> list; private int[] nums; /** 用来保存每一原创 2020-05-08 19:04:52 · 105 阅读 · 0 评论 -
242.有效的字母异位词
242.有效的字母异位词文章目录题目分析Solution题目分析使用HashMap有点过于庞大,由于都是英文小写字母,所以直接开个数组就行也可对s和t排序Solutionpublic boolean isAnagram(String s, String t) { if (s == null || t == null) return false; char[] sch...原创 2020-05-07 18:35:12 · 98 阅读 · 0 评论 -
572.另一个树的子树
572.另一个树的子树文章目录题目分析Solution题目分析一般做法,对二叉树进行遍历,比如先序遍历,如果找到一样的根节点,那么就去找它的左子树和右子树是否相同这里使用了二叉树的序列化,利用字符串进行解决其实使用了contains为什么要把空结点也表示?不表示空节点会导致有无数个二叉树附:前序遍历踩坑(12!#!#!) contains (2!#!#!)只要再加上...原创 2020-05-07 18:29:19 · 107 阅读 · 0 评论 -
面试题01.09.字符串轮转
面试题01.09.字符串轮转文章目录题目分析Solution题目分析这道题还挺有意思的首先,旋转字符串的特点是,某些字符从后面跑到了前面,这就好像由一队变两队,队尾变成了队头Solutionpublic static boolean isRevolving(String s1, String s2) { if (s1 == null || s2 == null) re...原创 2020-05-07 18:12:56 · 251 阅读 · 0 评论 -
最长公共子串
文章目录题目分析Solution - 二维数组Solution - 一维数组题目分析假设2个字符串分别是str1、str2i∈[1,str1.length]j∈[1,str2.length]假设dp(i,j)是以str1[i-1]、str2[j-1]结尾的最长公共子串长度dp(i,0)、dp(0,j)初始值均为0如果str1[i-1]=str2[j-1],那么dp(i,j)=dp...原创 2020-05-07 10:25:49 · 1433 阅读 · 0 评论 -
739.每日温度
739.每日温度文章目录题目分析Solution递减栈dp题目分析相当于寻找右边第一个比它大的位置,维持一个递减栈,存放索引输出链表中有几个位置的值已经知道:最右边第一个一定为0,从这就可以看出类似dp,因为温度不会再变化所以可以直接从倒数第二个开始,记录当前和它的右边当前温度<右边温度天数=索引位置的差值当前 = 右边 (把当前看成右边位置处...原创 2020-05-05 15:46:24 · 149 阅读 · 0 评论 -
654.最大二叉树及变式
654.最大二叉树文章目录题目分析Solution变式题题目分析Solution题目分析很容易想到首先比较找出最大值作为根节点,递归找出根节点的左子树的根节点和右子树的根节点Solution public TreeNode constructMaximumBinaryTree(int[] nums) { if (nums == null) return null; ...原创 2020-05-05 15:44:39 · 107 阅读 · 0 评论 -
155.最小栈
155.最小栈文章目录题目分析Solution - minStackSolution - LinkedList题目分析如何能实现O(1)的返回最小值:维护一个存放最小值的栈minStack,每次push时,就比较栈顶,把较小的再push到最小栈中,这样stack中每一个元素都对应着以它为栈顶时的一个最小值Solution - minStackpublic class MinStac...原创 2020-05-04 22:54:47 · 98 阅读 · 0 评论 -
234.回文链表
234.回文链表文章目录题目分析Solution题目分析中间节点:利用快慢指针,快指针每次走两步,慢指针每次走一步,当发现快指针的next或者next.next为空,意味着快指针已经走完链表,那么满指针正好位于中间位置反转链表:熟记!!!整体流程:走到中间结点:反转右边的链表分别从左边头结点和右边头结点开始,判断是否相等,当右边指向null时,中间结点要么被比较为相等,要么为奇...原创 2020-05-04 22:32:24 · 110 阅读 · 1 评论 -
239.滑动窗口最大值
239.滑动窗口最大值文章目录题目分析双端队列最大索引Solution - DequeSolution - maxIndex题目分析暴力法的时间复杂度为 O(n*k),弊端为每次扫描窗口的最大值,每两次扫描之间都会存在重复的值比较,已经知道了他们的最大值是谁了,所以要减少比较次数双端队列为什么要使用双端队列(单调队列)队列里要是滑动窗口范围的,当队列里的索引不再滑动窗口大的范围,...原创 2020-05-04 12:13:33 · 264 阅读 · 0 评论 -
86.分割链表
86.分割链表文章目录题目分析Solution题目分析把它分割成两个单独链表,最后再串起来如果说分割成三部分小于、相等、大于,也是相同思路特殊情况分析:Solutionpublic ListNode partition(ListNode head, int x) { if (head == null) return null; ListNode lHead = new ...原创 2020-05-03 21:48:36 · 90 阅读 · 0 评论 -
160.相交链表
160.相交链表文章目录题目分析Solution题目分析当两个链表长度相等时,比较到相同的对象时,即交叉点要满足所有情况下长度都相等,需要互相拼接,才会长度一定相等Solution public ListNode getIntersectionNode(ListNode headA, ListNode headB) { if (headA == null || headB =...原创 2020-05-03 21:28:07 · 103 阅读 · 0 评论 -
2.两数相加
2.两数相加文章目录题目分析Solution题目分析Solution原创 2020-05-03 21:19:29 · 123 阅读 · 0 评论 -
203.移除链表元素
203.移除链表元素文章目录题目分析Solution题目分析 把它想像成构建一个全新的链表,不等于val的,即是属于全新链表的结点 构造虚拟头节点Solution public ListNode removeElements(ListNode head, int val) { if (head == null) return null; // 新链表的头结点 ListN...原创 2020-05-03 20:50:39 · 78 阅读 · 0 评论 -
面试题16.部分排序
寻找未排序的部分 == 寻找逆序对,且最远的逆序对最右边位置:最右逆序对的位置最左边位置:从右往左的逆序对左 --> 右扫描过的最大值是:8如果发现当前值小于最大值,记录它的位置(2)右 --> 左扫描过的最小值是:1如果发现当前值大于最小值,记录它的位置(5)并且当 r == -1 时,即说明没有逆序对,直接返回 [-1,-1]...原创 2020-05-01 21:25:49 · 164 阅读 · 0 评论 -
面试题47.礼物的最大价值
面试题47.礼物的最大价值文章目录题目分析solution题目分析 由于只能向右向下,则可以初始化第一行和第一列为对应的累加和 题解对应着走到右下角的价值solution public int maxValue(int[][] grid) { int rows = grid.length; int cols = grid[0].length; ...原创 2020-05-01 21:19:26 · 180 阅读 · 0 评论 -
5.最长回文子串(四种方法)
文章目录Solution 1 - 动态规划Solution 2 - 中心扩展Solution 3 - 中心扩展优化Solution 4 - ManacherSolution 1 - 动态规划dp[i][j]表示为s[i,j]是否为回文串;注意单字符一定为回文串,那么dp表格的对角线就可以预先填上当s长度小于等于2时,s是否为回文串,只需要判断s[i]和s[j]是否相等当s长度大于2时,...原创 2020-05-01 21:06:29 · 8348 阅读 · 2 评论 -
72.编辑距离
题目分析主要理解dp数组的含义:即dp[i][j]为s1的前i个字符转化成s2的前j个字符所需要的最小的操作数dp数组的第0行:空串转成s2的最小操作数,就应该是每次都在其后增加dp数组的第0列:s1转成空串的最小操作数也就是每次都删除一个字符转移很简单但容易考虑不全:1)⬇ 由s1的前i-1个字符转化为s2的前j个字符 2)➡ 由s1的前i个字符转化为s2的前j-1个字符 3 ) ...原创 2020-05-01 20:44:35 · 182 阅读 · 0 评论 -
151.翻转字符串里的单词
文章目录题目分析Solution题目分析消除多余空格所以可以编写一个方法,实现对一个范围进行逆序Solution public static String reverseWords(String s) { if (s == null) return ""; char[] chars = s.toCharArray(); //...原创 2020-04-30 23:19:50 · 105 阅读 · 0 评论 -
333. 最大BST子树
最大BST子树文章目录思路Solution思路此题采用自底向上的思想,只有左右子树都为BST(包含null),那么其以root为根节点的二叉树才能是BST这里想到后序遍历(左右根)注意:有一种情况以root为根节点的二叉树不是BST,那么所求的BST一定在较矮的子树中,这里设置了 leftBSTSize = -1, rightBSTSize= -1,作为哨兵,如果root的左右子树...原创 2020-04-30 23:06:10 · 527 阅读 · 0 评论 -
3. 无重复字符的最长子串
3. 无重复字符的最长子串文章目录题目分析Solutoin题目分析假设给定字符串"pwwkew"字符串中的无重复子串出现位置有如下三种:第一种情况:‘li’ 到 ‘i-1’ 没有重复字符,那么必然不包含出现过的D的重复字符pi的位置第二、三种情况:以’i位置’ 的D结尾的子串一定不能包含’pi位置’的D所以 li 每次找到以i为结尾的子串的最左索引,只需覆盖更新 liSolut...原创 2020-04-30 22:47:36 · 96 阅读 · 0 评论