自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 收藏
  • 关注

原创 739. 每日温度 还是单调栈

739. 每日温度难度:中等题目描述解题思路写了几道单调栈的题目之后就直到套路啦~直接套模板就可以了public int[] dailyTemperatures(int[] T) { if(T.length == 0) return T; int[] re = new int[T.length]; Stack<Integer> stack = new Stack<>(); stack.push(0); for (i

2020-05-30 23:43:16 204

原创 496. 下一个更大元素 I 单调栈+哈希表

496. 下一个更大元素 I难度:简单题目描述解题思路写了今天的每日一题,特意去找了找其它单调栈的题目来做,这道题就思路很清楚啦。维持一个递减的单调栈,如果下一个数字大于栈顶元素,那栈顶元素就找到了对应的右边第一个比它大的数。因为数组中的数字没有重复元素,所以用哈希表来存需要找的元素public int[] nextGreaterElement(int[] nums1, int[] nums2) { if(nums1.length == 0) return

2020-05-30 18:36:02 151

原创 84. 柱状图中最大的矩形 单调栈经典题目

84. 柱状图中最大的矩形难度:困难 2020/5/30每日一题打卡√单调栈题目:题目描述解题思路参考题解:【柱状图中最大的矩形】单调栈入门,使用单调栈快速寻找边界暴力解法、栈(单调栈、哨兵技巧)这道题和接雨水的那道题好像啊,那道题求凹下去的面积,这道题求凸起的面积。还是用单调栈来写,栈里面存放的元素保持递增关系,作用是快速确定边界。如果新元素比栈顶元素严格小,那么就确定了右边界,再加上栈里使递增关系,所以左边界也能确定。把当前栈顶元素出栈,计算面积,比较最大值。代码模板:stac

2020-05-30 15:09:39 198

原创 力扣刷题 动态规划:打家劫舍全系列

力扣刷题 动态规划:打家劫舍全系列这个系列有好几道,一个一个来!文章目录力扣刷题 动态规划:打家劫舍全系列198. 打家劫舍213. 打家劫舍 II337. 打家劫舍 III解法一:暴力递归解法二:暴力递归+记忆化优化解法三:消除后效性198. 打家劫舍难度:简单题目描述解题思路这是这个系列里最简单的一道啦,状态转移方程很明显。对于第i个房子,要么偷要么不偷,如果偷那金额就等于前两天的金额+当前房子的金额;如果不偷那就等于前一天的金额。每天从这两种选择中选出金额最大的,写成状态转移方程就

2020-05-29 21:49:07 623

原创 235. 二叉搜索树的最近公共祖先 利用二叉搜索树特性

235. 二叉搜索树的最近公共祖先难度:简单进阶题:236. 二叉树的最近公共祖先题目描述解题思路之前做过一道普通二叉树查找最近公共祖先的,这道题限定了是二叉搜索树,利用二叉搜索树的特性可以很容易找到两个节点是在根节点的左侧还是右侧,简单很多。public TreeNode lowestCommonAncestor1(TreeNode root, TreeNode p, TreeNode q) { if(p.val > root.val && q.val

2020-05-27 14:04:06 77

原创 974. 和可被 K 整除的子数组 前缀和+哈希表+同余定理

974. 和可被 K 整除的子数组难度:中等 2020/5/27每日一题打卡√有一点不懂的是:明明哈希表来存取的时间复杂度和数组都是O(1),但是在好多题里用数组比用哈希表速度快很多,就疑惑题目描述解题思路一看到这种:大写加粗的 子数组 区间和 连续非空 就应该联想到前缀和如果用暴力法时间复杂度O(n2),才能求出每个区间的和。但是用前缀和能在O(n)内得到任意区间的和。这道题也一样,遍历一次数组,累加计算到当前数字的前缀和并且用哈希表保存已经出现过的前缀和以及次数。这道题跟经典的“

2020-05-27 13:21:46 310

原创 287. 寻找重复数 二分法+快慢指针两种方法

287. 寻找重复数难度:中等 2020/4/26每日一题打卡√题目描述解题思路1、二分查找参考题解:使用二分法查找一个有范围的整数(结合抽屉原理)基本思想就是利用抽屉原理,如果只有五个抽屉,却有6个苹果,那么一定有两个苹果在同一个抽屉里。具体到这道题,因为数字的范围是确定的,1~ n,用二分法对这n个位置来计算小于mid的数量。例如n=10,初始mid = 5,然后遍历数组统计小于5的个数,如果有6个数字小于等于5,那么肯定在0~5的范围内出现了重复的数字,缩小右边界到5。因为题目给

2020-05-26 18:55:40 309

原创 146. LRU缓存机制 哈希表+双向链表

146. LRU缓存机制难度:中等2020/5/25 每日一题打卡√题目描述解题思路这道题好像三月份每日一题也出过,那时候刚开始刷题,直接放弃了,今天能完整自己写出来也是一种进步!所用到的数据结构是哈希表+双向链表因为要求在O(1)时间内实现查找,应该联想到哈希表或者数组,数组长度不确定,所以还是用哈希表。然后要求找到最长时间没用的元素,应该考虑到用链表,把最新访问过的元素放在头部,最久没访问的放尾部,这就应该联想到双向链表,双向链表具有能很快的查找头尾节点的特性。Java里自带的li

2020-05-25 21:16:16 143

原创 4. 寻找两个正序数组的中位数

4. 寻找两个正序数组的中位数难度:困难 2020/5/24每日一题打卡√今天也是困难题耶,但是如果不按要求满足时间复杂度的话就一点也不难,还挺简单的题目描述解题思路1、O(m+n)解法常规的做法是先对两个数组进行归并排序,然后直接找到对应中间位置下标的值。但是这个题不需要全部排序,不需要保存排序之后的结果,可以把空间复杂度优化到O(1),直接找到对应位置的值之后就返回。用两个变量n1保存前一位结果,n2保存后一位结果,如果数组总长度是奇数就返回n1,如果是偶数就等于(n1+n2)/2

2020-05-25 11:54:40 164

原创 76. 最小覆盖子串 滑动窗口+哈希表

76. 最小覆盖子串难度:困难2020/5/23每日一题打卡√类似用滑动窗口来写的题目:567,438,3,题目描述解题思路好久不见的困难题,当然是抄题解的一天有个坑,虽然我没遇到,但是很多人都提到了,还是写在前面学习学习:有些人维护了两个哈希表,然后用==判断对应的值是不是相等,但是这样没办法通过最后一个很长的用例,原因是:1、滑动窗口加哈希表看到一个滑动窗口的模板,抄过来学习学习参考题解:我写了一首诗,把滑动窗口算法变成了默写题/* 滑动窗口算法框架 */void sli

2020-05-23 23:59:50 298

原创 237. 删除链表中的节点

237. 删除链表中的节点难度:简单题目描述解题思路一开始看到这个题好迷茫啊,以为是普普通通一道题,结果仔细一看怎么没给头节点,看了答案才知道,原来不用头节点,就是直接原地删除。/* * 237. 删除链表中的节点 * 2020/5/22 这个node本身就是链表的一部分,没有给出head */ public void deleteNode(ListNode node) { if(node.next == null) node = null;

2020-05-23 00:14:41 419

原创 105. 从前序与中序遍历序列构造二叉树 + 106后序和中序构造

105. 从前序与中序遍历序列构造二叉树难度:中等 2020/5/22每日一题打卡√题目描述解题思路这种题目也是考研的时候经常写,但是是用手算,知道方法,但是用代码写起来有点模糊/* * 105. 从前序与中序遍历序列构造二叉树 * 2020/5/22每日一题打卡 */ public TreeNode buildTree(int[] preorder, int[] inorder) { HashMap<Integer, Integer> has

2020-05-22 21:24:45 109

原创 345. 反转字符串中的元音字母

345. 反转字符串中的元音字母难度:简单题目描述解题思路唯一的一个坑就是会出现大写字母/* * 345. 反转字符串中的元音字母 * 2020/5/20 */ public String reverseVowels(String s) { int p = 0,q = s.length()-1; char f,b; char str[] = s.toCharArray(); while(p <= q) { f = str[p];

2020-05-20 16:21:53 247

原创 1124. 表现良好的最长时间段 前缀和+哈希表

1124. 表现良好的最长时间段难度:中等题目描述解题思路看到这种 要求连续区间 而且满足一定条件,最大/最小等等都可以考虑一下前缀和法。前缀和最大的医用就是可以在O(1)时间内得到任意一个区间(i,j)的和。在这道题里,当工作时间大于8,设置成1,小于8等于-1,由此计算前缀和如果前缀和大于0,说明从0开始的区间里到当前位置都满足要求,长度等于i;重点在于小于0的情况,因为题目要求严格大于,如果当前位置小于0,例如等于-2,要想在区间里满足要求,那么区间另一个端点至少要是-3,这时区间长度

2020-05-20 15:54:33 254

原创 1371. 每个元音包含偶数次的最长子字符串

1371. 每个元音包含偶数次的最长子字符串难度:中等2020/5/20每日一题打卡 √ 前缀和+状态压缩+哈希表今天2020520,算是一个很特别的日子了!但是每日一题还是要写的(抄题解的一天)类似的题:1124. 表现良好的最长时间段题目描述解题思路参考题解:每个元音包含偶数次的最长子字符串 官方题解❤将题目一步步等价转化 | “非奇即偶” 与二进制的联系模模糊糊的看懂了一点首先由 最长连续子串这点想到前缀和,前缀和能效率很高的遍历区间找到符合要求的,比如优美子数组的那道题。然

2020-05-20 13:58:14 179

原创 145. 二叉树的后序遍历

145. 二叉树的后序遍历难度:困难题目描述解题思路1、递归解法左右根,递归解法永远是一样的套路public List<Integer> postorderTraversal(TreeNode root) { List<Integer> re = new LinkedList<Integer>(); postorderHelper(root, re); return re; } public void postorde

2020-05-20 00:07:47 102

原创 144. 二叉树的前序遍历

144. 二叉树的前序遍历难度:中等题目描述解题思路1、递归二叉树遍历递归写法都差不多,就是访问顺序的区别,前序遍历是:根左右,先访问当前节点然后访问左边和右边的节点。public List<Integer> preorderTraversal(TreeNode root) { List<Integer> re = new LinkedList<Integer>(); preorderHelper(root, re); return

2020-05-19 21:17:16 98

原创 94. 二叉树的中序遍历

94. 二叉树的中序遍历难度:中等题目描述解题思路1、递归版本/* * 94. 二叉树的中序遍历 * 2020/5/19 递归版本 左跟右 */ public List<Integer> inorderTraversal(TreeNode root) { List<Integer> re = new LinkedList<Integer>(); inorderHelper(root, re); return

2020-05-19 20:12:08 169

原创 680. 验证回文字符串 Ⅱ

680. 验证回文字符串 Ⅱ难度:简单 2020/5/19每日一题打卡√题目描述解题思路一般字符串的题目都优先想到双指针,回文字符串更是这样。这道题变化的地方是可以删掉一个字符,那么在遇到不一样的字符时,要么删掉左边的,要么删掉右边的,再继续判断接下来的字符串是不是回文字符串。public boolean validPalindrome(String s) { char[] str = s.toCharArray(); int i = 0,j = str.length-1;

2020-05-19 12:44:03 185

原创 207. 课程表

207. 课程表难度:中等题目描述解题思路和昨天的每日一题很像,区别在于不需要记录成功的课程顺序,只要返回true或者false。还是用队列实现的kahn算法public boolean canFinish(int numCourses, int[][] prerequisites) { int[] degree = new int[numCourses]; int count = 0,pre,next; Queue<Integer> queue = new Lin

2020-05-19 00:05:28 87

原创 152. 乘积最大子数组 动态规划

152. 乘积最大子数组难度:中等 2020/5/18每日一题打卡√今天也是磨磨蹭蹭只想完成任务的一天题目描述解题思路参考题解:动态规划(理解无后效性)1、记录最大最小累计和这道题和最大子序和那道好像,也是用动态规划,但是比那个要复杂一点。首先因为数字都是整数,所以如果乘一个正数肯定会使结果增大,乘一个负数会让结果减小。问题在于负数的个数不确定,如果时偶数个负数的话,那整个数组所有的元素累乘就是最后结果,如果负数个数是奇数个就不能这样。所以在遍历计算最大值的时候,也要顺便把最小值记录

2020-05-18 19:47:54 314

原创 210. 课程表 II kahn求拓扑图算法

210. 课程表 II难度:中等题目描述解题思路以前没有写过图的,但是有了解过拓扑排序,根据提示还有算法描述很容易就写出代码了。用栈和队列都行,如果用栈就是深度优先搜索,用队列就是广度优先搜索,原理都一样只不过对于节点的搜索顺序不一样。1、用栈实现kahn算法原理就是:先找到所有入度为0的节点,入栈,然后依次搜索,删掉所有由这个节点发出的边,并且把指向的节点入度减1/* * 210. 课程表 II * 实际上是求有有向图中是否存在环路,如果有环路则不存在拓扑排序 */

2020-05-18 00:23:46 191

原创 92. 反转链表 II

92. 反转链表 II难度:中等类似题目:反转链表1题目描述解题思路先设置虚拟头节点便于处理m=1的情况,然后找到第m个节点的前一位,反转m~n之间,注意最后还要把反转之后节点指向剩余的节点/* * 92. 反转链表 II * 2020/5/15 */ public ListNode reverseBetween(ListNode head, int m, int n) { if(m == n) return head; Lis

2020-05-15 17:29:24 202

原创 299. 猜数字游戏

299. 猜数字游戏难度:简单题目描述解题思路1、用哈希表遍历两次,第一次把正确答案种数字和出现次数加入到哈希表里,并记录下公牛的次数。第二次把猜的数字里再正确答案种出现的次数记录下来,减去公牛次数就是母牛public String getHint(String secret, String guess) { StringBuilder sb = new StringBuilder(); HashMap<Character, Integer> hashMap = new

2020-05-15 16:34:00 129

原创 234. 回文链表 双指针+反转链表

234. 回文链表难度:简单题目描述解题思路本来很简单滴,但是要满足时间复杂度O(n)和空间复杂度O(1)费了很多时间,一些链表的细节还是搞得不太清楚思路:先用快慢指针找到中间节点(偏左的那个)–>反转右半部分–>同时前进判断是不是符合回文数字public boolean isPalindrome(ListNode head) { if(head == null) return true; ListNode fast = head,slow = h

2020-05-15 15:10:17 181

原创 724. 寻找数组的中心索引

724. 寻找数组的中心索引难度:简单题目描述解题思路先遍历一遍得到前缀和,然后再依次遍历看是否有满足条件的要注意的一个坑是:默认边界左右的和是0public int pivotIndex(int[] nums) { int n = nums.length; int[] prefix = new int[n+1]; //多一个方便处理边界 for (int i = 1; i <= n; i++) { prefix[i] = prefix[i-1] +

2020-05-15 13:14:04 57

原创 113. 路径总和 II 深度优先搜索 + 回溯法

113. 路径总和 II难度:中等相似题目:路径总和1题目描述解题思路还是用深度优先搜索来实现,因为深度优先搜索的特点是每一步之间差别很小,所以很适合用来完成回溯问题这道题和1的区别是要记录满足目标的路径,只需要修改一些细节就可以了/* * 113. 路径总和 II * 2020/5/14 要求记录路径 * 回溯法 设置现场 递归 恢复现场 */ public List<List<Integer>> pathSum(TreeN

2020-05-14 22:33:27 143

原创 520. 检测大写字母

520. 检测大写字母难度:简单题号如此浪漫的题目这么简单,是为了让我们相信爱情嘛题目描述解题思路不正确的情况比较多,不如直接考虑正确的情况“要么全大写,要么全小写,要么只有首字母大写/* * 520. 检测大写字母 * 2020/5/14 */ public boolean detectCapitalUse(String word) { char[] letter = word.toCharArray(); int upper = 0; for (in

2020-05-14 20:55:42 114

原创 面试题22. 链表中倒数第k个节点 快慢指针

#面试题22. 链表中倒数第k个节点难度:简单题目描述解题思路经典的快慢指针/* * 面试题22. 链表中倒数第k个节点 * 2020/5/14 * 快慢指针思想 快指针先前进k个,再同步前进,这样当快指针到达终点的时候,慢指针就指向倒数第k个 */ public ListNode getKthFromEnd(ListNode head, int k) { if(head == null) return head; ListNode fast = head,s

2020-05-14 20:33:52 116

原创 112. 路径总和 DFS递归实现

#112. 路径总和难度:简单题目描述解题思路1、做加法就是简单的DFS,每次遍历到叶子节点的时候,判断当前路径和是不是等于sumpublic boolean hasPathSum(TreeNode root, int sum) { return sumHelper(root,0,sum); }public boolean sumHelper(TreeNode root,int sum,int target) { if(root == null) retu

2020-05-13 13:10:57 146

原创 102. 二叉树的层序遍历 BFS+DFS

#102. 二叉树的层序遍历难度:中等 2020/5/13每日一题打卡√和那道右视图的好像题目描述解题思路以前写过的 ,简单1、BFSpublic List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> re = new LinkedList<>(); Queue<TreeNode> queue = new Linked

2020-05-13 12:18:28 308

原创 50. Pow(x, n) 递归+迭代方法实现

#50. Pow(x, n)难度:中等 2020/5/11每日一题打卡抄方法的一天嘿嘿!题目描述解题思路1、快速幂递归解法public double myPow(double x, int n) { if(n == 0 || x == 1) //递归出口,任何数的0次方都等于1 return 1; if(n == 1) //加快递归速度 return x; if(n==Integer.MIN_VALUE) //面向测试用例编程 return

2020-05-11 12:35:42 568

原创 236. 二叉树的最近公共祖先

#236. 二叉树的最近公共祖先难度:中等 2020/5/10每日一题打卡√ LCA问题抄答案的一天题目描述解题思路今天这个题之前没做过类似的,自己想的方法也很复杂,就直接取看了答案,递归的方法好妙。去搜了LCA问题发现有好多很复杂的解法public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root == null) //如果根节点为空 return nul

2020-05-10 21:31:36 105

原创 344. 反转字符串 双指针原地反转

#344. 反转字符串难度:简单题目描述解题思路双指针,现在写这种题感觉就像写1+1,过于简单public void reverseString(char[] s) { if(s == null || s.length == 0) return; int p = 0,q = s.length-1; while(p < q) { char temp = s[p]; s[p] = s[q]; s[q] = temp; }

2020-05-09 16:35:26 153

原创 350. 两个数组的交集 II

#350. 两个数组的交集 II难度:简单类似题目:349. 两个数组的交集 哈希表题目描述解题思路和1的区别在于要考虑同个元素多次出现的情况,也很简单,还是哈希表public int[] intersect(int[] nums1, int[] nums2) { int[] re = new int[nums1.length]; HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer&gt

2020-05-09 13:47:40 109

原创 69. x 的平方根 多种方法JAVA

#69. x 的平方根难度:简单 2020/5/9 每日一题打卡解题方法#69. x 的平方根***1、偷懒大法******2、暴力法******3、二分法提高效率******4、牛顿法(高级)******5、袖珍计算器法(新知识点)***题目描述解题思路没仔细看题目之前以为是要算出来平方根,结果居然只要求证书部分,那感觉难度降低了好多。1、偷懒大法保护脑细胞,轻轻松松AC一道题public int mySqrt(int x) { return (int) Math.s

2020-05-09 12:45:41 283

原创 217. 存在重复元素 哈希set

#217. 存在重复元素难度:简单题目描述解题思路这道题明明很简单,但是我记得有道题是找出整个数组里只出现一次的数字,记混了,然后想着用异或去写就搞复杂了。实际上很简单,用hashSet很容易判断,也可以用桶排序,但是题目没给数字范围,还是用哈希吧public boolean containsDuplicate(int[] nums) { Set<Integer> set = new HashSet<Integer>(); for(int

2020-05-08 19:17:03 79

原创 349. 两个数组的交集 哈希表

#349. 两个数组的交集难度:简单每天一道简单题,快乐无限题目描述解题思路先把第一个数组里的数字加入到哈希表(或者哈希set里),这一步实际上就对第一个数组进行了去重。然后依次遍历第二个数组里的元素,如果存在于第一个哈希表里面,就说明是重合部分,添加到结果数组里。添加完一个要删掉public int[] intersection(int[] nums1, int[] nums2) { HashMap<Integer, Integer> hashMap= new HashMa

2020-05-08 18:55:21 247

原创 221. 最大正方形 动态规划

#221. 最大正方形难度:中等 2020/5/8每日一题打卡√题目描述解题思路看到0,1矩阵就想到BFS,想了一圈好像不太对劲,结果看一眼标签发现是动态规划。设置动态规划数组dp[i][j] ,意义是以(i,j)为右下角的举行最大边长。一个点能否形成矩形,由这个点左边,上边和左上↖的三个点决定,递推关系是:dp[i][j] = min(dp[i-1][j-1],dp[i][j...

2020-05-08 14:24:45 281

原创 572. 另一个树的子树 递归

#572. 另一个树的子树难度:简单 2020/5/7每日一题打卡√啊今天又是划水的一天呢,梦想小镇真好玩,玩着玩着一天就过去了题目描述解题思路二叉树很多题目都用递归来完成比较简单,也知道要分左子树右子树,但是还是细节写不出来。刷的题还不够多,要继续加油!分析题目:如果是子树,要么两棵树相等,要么是左边的子树,要么是右边的子树。所以递归结束的条件是判断出t和s的一部分相等或者不相等...

2020-05-07 22:53:31 123

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除