07 2018 档案
摘要:"85. 最大矩形" 解法1: 一个思路就是这个可以看作 "84. 柱状图中最大的矩形" 的扩展,这道题的二维矩阵每一层向上都可以看做一个直方图,输入矩阵有多少行,就可以形成多少个直方图,对每个直方图都调用 "84. 柱状图中最大的矩形" 中的方法,就可以得到最大的矩形面积。 解法2: 另外一个思路
阅读全文
摘要:"84. 柱状图中最大的矩形" 用到了单调栈的知识,还是第一次碰到。学习了好久 看这两篇文章吧: "直方图中最大的矩形" "单调栈小结" 简单来说,维护一个单调栈,如果当前元素大于栈顶元素,则把当前元素的坐标入栈,否则,弹出栈顶元素直到当前元素可入栈。 在栈顶元素弹出时,把弹出的元素当成最短木板,计
阅读全文
摘要:"82. 删除排序链表中的重复元素 II" 83题的扩展,相比于83题。我们增加一个last_last来记录重复元素前面的节点即可
阅读全文
摘要:"83. 删除排序链表中的重复元素" 链表操作
阅读全文
摘要:"81. 搜索旋转排序数组 II" public class Solution { // 这个问题在面试中不会让实现完整程序 // 只需要举出能够最坏情况的数据是 [1,1,1,1... 1] 里有一个0即可。 // 在这种情况下是无法使用二分法的,复杂度是O(n) // 因此写个for循环最坏也是
阅读全文
摘要:"80. 删除排序数组中的重复项 II" 模拟,没啥意思。。就是挪数而已 class Solution { public int removeDuplicates(int[] nums) { int cnt = 0; int len = nums.length; int top = 0; int l
阅读全文
摘要:"208. 实现 Trie (前缀树)" 实现Trie树,网上教程一大堆,没啥可说的 public class Trie { private class Node { private int dumpli_num;////该字串的重复数目, 该属性统计重复次数的时候有用,取值为0、1、2、3、4、5
阅读全文
摘要:"212. 单词搜索 II" 这leetcode的评判机绝对有问题!!同样的代码提交,有时却超时!害得我至少浪费两个小时来寻找更优的答案= =,其实第一次写完的代码就可以过了,靠!!!第207位做出来的 趁热,我把 "79. 单词搜索" 也做了一下 与79题完全,无非是从一个word变成了多个wor
阅读全文
摘要:"79. 单词搜索" 这个题跟前两个题思路类似,递归搜即可 先找到首节点,然后4个方向去搜。 状态函数:dfs(int i, int j, int k, char[][] board, String word, int m, int n, boolean[][] f) i,j表示当然已经搜到了节点(
阅读全文
摘要:"78. 子集" 与 "77. 组合" 几乎一样,我们只需将代码稍微改一下即可: 1. k是需要变动的了,从1~n。我们在dfs外层加个循环枚举k即可 2. 取数集合不再是从数字[1,n]取了,需要从集合nums总选取一个数来(其实道理是一样的,我们换成坐标即可,也就是[nums[0],nums[1
阅读全文
摘要:"77. 组合" 递归回溯枚举搜就好 dfs状态(int n, int k, int last, List cur, List ans) n表示从[1~n]中取数,k表示当前状态下还需要取几个数,last表示上一个数取的是几,cur表示当前已经取的数。ans为总的答案list,最后要返回到main的
阅读全文
摘要:"76. 最小覆盖子串" 脑子不清醒的时候, 不要刷题,不要刷题,不要刷题。。。。 我这么困,为什么要刷题! 在串S上维护i,j两个指针,i表示当前包含T所有字母的起始位置,相反j是终止位置。 首先让j一直加,直到找到了字串s.substring(i,j)满足条件。之后,j再++,每碰到一个T中拥有
阅读全文
摘要:"75. 分类颜色" 我们直接按难度最高的要求做:你能想出一个仅使用常数空间的一趟扫描算法吗? 1. 常数空间 2. 只能扫描一趟。注意,是一趟,而不是O(n) 题中只会出现3个数字:0,1,2。换句话说,0肯定在最前面,2肯定都在后面,1都在中间 思路大概这样: 我们用双指针法,i从前往后扫,当n
阅读全文
摘要:"74. 搜索二维矩阵" 就是一个二分查找
阅读全文
摘要:图书资源整理 京东 多看 "周读" "鸿鹄搜书" "我的小书屋 最新最全电子书免费下载"
阅读全文
摘要:"73. 矩阵置零" 这次直接上代码吧 class Solution { public void setZeroes(int[][] matrix) { int m = matrix.length; if (m == 0) { return; } int n = matrix[0].length;
阅读全文
摘要:"72. 编辑距离" 再次验证leetcode的评判机有问题啊!同样的代码,第一次提交超时,第二次提交就通过了! 此题用动态规划解决。 这题一开始还真难到我了,琢磨半天没有思路。于是乎去了网上喵了下题解看到了动态规划4个字就赶紧回来了。 脑海中浮现了两个问题: 为什么能用动态规划呢?用动态规划怎么解
阅读全文
摘要:"71. 简化路径" 维护一个栈,当出现.时不做操作,出现..时栈中弹走一个元素 最后从头遍历栈输出即可 注意,文件名可能是千奇百怪的,超过两个.(比如...)可认作文件名 注意, 不要相信playgroud提供的main函数! 不要相信playgroud提供的main函数! 不要相信playgro
阅读全文
摘要:"70. 爬楼梯" 最简单的动态规划 假设f[i]表示爬到第i层有几种爬法 那么状态转移方程为:f[i] = f[i 1] + f[i 2] 初始条件显然是:f[1]=1,f[2] = 2; class Solution { public int climbStairs(int n) { if (n
阅读全文
摘要:"69. x 的平方根" 非常简单的一个题,用二分法逼近求出ans即可,额外注意下溢出问题。 不过我要给自己增加难度,用long或者BigNum实现没意思,只能使用int类型 换句话当出现溢出时我们自己得检测出来 原代码(会溢出) 两处会出现溢出,我们换种不溢出的方法实现即可了 优化代码 另外一种判
阅读全文
摘要:"68. 文本左右对齐" 国区第240位AC的~我还以为坑很多呢,一次过,嘿嘿,开心 其实很简单,注意题意:使用“贪心算法”来放置给定的单词;也就是说,尽可能多地往每行中放置单词。 也就是说,一行里放置多少word,是一次确定的,后面的行word怎么分配,跟前面的行没有关系。 注意有个隐藏条件:两个
阅读全文
摘要:leetcode的java代码提供的main函数中,往往有关于json的依赖。。。我找了许久才找到他们用的是这个json实现
阅读全文
摘要:"67. 二进制求和" 模拟加法运算
阅读全文
摘要:"66. 加一" 模拟加法运算,很简单 注意进位即可
阅读全文
摘要:"65. 有效数字" 第19次才通过,前面错了18次。。。 相信我,不用理解或者分析我的代码,一遍一遍去自己尝试吧少年,十几次后你就会做出来了 你会感受到这个题带来的诚意的 class Solution { public boolean isNumber(String s) { // 去掉前后空格
阅读全文
摘要:"64. 最小路径和" 与 "63. 不同路径 II" "62. 不同路径" 思路类似,按题号刷题的强迫症终于尝到了甜头233333 同样使用动态规划 f[i][j]表示,在(i,j)处的最短路径和。由于只能往右走或者往下走,显然,状态转换方程为: f[i][j] = min(f[i 1][j],f
阅读全文
摘要:"63. 不同路径 II" 无非就是在上一个题 "62. 不同路径" 加了些障碍嘛,做法完全一样 在计算f[i][j]的时候,判断一下上方或者左方有没有障碍物,有的话就说明不能从那个方向过来,不累加那个方向的值就是了 障碍物在终点时属于特殊情况,需要额外注意
阅读全文
摘要:"62. 不同路径" 我们直接用递归来模拟
阅读全文
摘要:"61. 旋转链表" 先求出链表的长度,并把链表首尾相连 然后题目中要求向右转,我们让k`=len k 改成向左转 然后遍历到第(k` 1)个节点,与下一个节点断开即可 (k` 1).next即为新的head
阅读全文
摘要:"60. 第k个排列" 还是使用之前用过多次的nextPermutation方法。。。(几乎所有跟排列相关的题都是同一个题 ) class Solution { public String getPermutation(int n, int k) { int[] nums = new int[n];
阅读全文
摘要:"59. 螺旋矩阵 II" 这题跟 "54. 螺旋矩阵" 讨论是一样的 就不废话了 class Solution { public int[][] generateMatrix(int n) { int[][] dx = {{0, 1}, {1, 0}, {0, 1}, { 1, 0}}; bool
阅读全文
摘要:"58. 最后一个单词的长度" 这题别看简单,但是恶心啊。。。我粗心大意交错了好几次23333
阅读全文
摘要:"57. 插入区间" 把这个newInterval加入到list中,然后调用 "56. 合并区间" 的代码。。。 不过,既然人家题都出了,且说给出的就是一个无重叠、已经排好序的List,让你只插一个就好。那我们是不是可以只针对这一个插入的处理呢? 当然可以了,首先可以先找到newInterval.s
阅读全文
摘要:"56. 合并区间" 先对输入排序,然后从前到后判断即可 今天刚学了java的lambda,正好拿来练练手,写起来确实爽。
阅读全文
摘要:"55. 跳跃游戏" 分明就是 "45. 跳跃游戏 II" 的缩水版本嘛。。😓,难度高的版本居然放在了前面,把像我这种有强迫症的必须按照题号刷题的人不放在眼里么。。。 class Solution { public boolean canJump(int[] nums) { return jump
阅读全文
摘要:"54. 螺旋矩阵" 模拟 还是用老技巧,用一个dx来描述某个方向的i,j坐标变换情况。 int[][] dx = {{0, 1}, {1, 0}, {0, 1}, { 1, 0}}; 如果按题目中的例子来看的话,分别表示向左,下,右,上走时,i,j坐标应该如何变换 class Solution {
阅读全文
摘要:"53. 最大子序和" 贪心 这题就跟个脑筋急转弯一样,从第一个开始累加,如果累加和低于0了,说明前面的肯定不能要,重新开始累加即可嘛 class Solution { public int maxSubArray(int[] nums) { int ans = Integer.MIN_VALUE;
阅读全文
摘要:"52. N皇后 II" 跟上个题一模一样,现在只需输出个数即可 class Solution { public int totalNQueens(int n) { boolean[] row = new boolean[n]; boolean[] h = new boolean[2 n]; boo
阅读全文
摘要:"51. N皇后" 啊,经典的N皇后问题。想当初高中练NOIP的时候,这个题把我折磨了好久 经典的dfs+回溯问题 4个约束条件,题中没有明确指出(并不是所有人都知道国际象棋的规则啊喂): 一个皇后在其横纵线与两条斜线上,不能存在其它皇后。 我们来用4个数组来记录对应的4个约束状态(其实3个就够了)
阅读全文
摘要:"50. Pow(x, n)" ACM时快速幂都快用烂了。。。此题思路类似 假如 n = 13,13在二进制中表示为:00001101,那么13 = 2^3 + 2^2 + 2^0 class Solution { public double myPow(double x, int n) { int
阅读全文
摘要:"49. 字母异位词分组" 桶排分类即可 class Solution { public List groupAnagrams(String[] strs) { Map map = new HashMap(); for (String str : strs) { map.computeIfAbsen
阅读全文
摘要:"48. 旋转图像" 模拟题,其实挺不喜欢做模拟题的。。。 其实这题一层一层的转就好了,外层转完里层再转,其实就是可重叠的子问题了。 转的时候呢,一个数一个数的转,一个数带动四个数。如图所示,2这个数应该怎么转: 难点就是如何用坐标表示出来相对位置,写坐标的时候思路一定要清晰啊! class Sol
阅读全文
摘要:"47. 全排列 II" 比上一个题多了个重复性 与 "46. 全排列" 完全一样的代码。。。
阅读全文
摘要:"46. 全排列" 这题我们可以借用 "31. 下一个排列" 写的nextPermutation函数来做,稍微改造一下即可 注意要先给nums排个序
阅读全文
摘要:"45. 跳跃游戏 II" 动态规划 此题可以倒着想。 看示例: [2,3,1,1,4] 我们从后往前推,对于第4个数1,跳一次 对于第3个数1,显然只能跳到第4个数上,那么从第3个数开始跳到最后需要两次 对于第2个数3,显然一步到位,跳一次 对于第一个数2,只能选择跳一次还是跳两次,显然选择跳一次
阅读全文
摘要:"875. 爱吃香蕉的珂珂" 这题时间要求比较严格。。。 首先,将piles排序,然后二分查找。 总之,答案K肯定位于piles[?]~piles[?+1]或者1~piles[0]之间 所以我们先二分把?找到,然后再二分找到K即可 class Solution { public int minEat
阅读全文
摘要:"874. 行走机器人模拟" 模拟 描述方向时有个技巧:int[][] dx = {{0, 1}, {1, 0}, {0, 1}, { 1, 0}}; 分别存储机器人向上、右、下、左走时,坐标应该如何变换 class Solution { public int robotSim(int[] comm
阅读全文
摘要:"872. 叶子相似的树" 前序遍历,记录叶子节点即可
阅读全文
摘要:"44. 通配符匹配" 动态规划 做动态规划很简单,三步走: 第一步,判断可否用动态规划做,即判断是否满足两个条件:①最优子结构,②重叠子问题。显然该题求s与p是否match,可由其字串层层分解上来。 我语文不好一两句解释不清楚,不过看完这篇文章,基本就会判断是不是满足这两个条件了。 "算法 动态规
阅读全文
摘要:"43. 字符串相乘" 高精度乘法,这题敲的太多了。。直接交了
阅读全文
摘要:"42. 接雨水" 思路:一块柱子能接水的量取决于它左右两边最高的柱子中较短的一个。
阅读全文
摘要:"41. 缺失的第一个正数" 注意这题要求时间复杂度应为O(n),并且只能使用常数级别的空间。 挺有意思的一个题。 思路: 通过交换元素的位置使得正确的位置仅存放正确的数字,例如给定一个数字3那么他应该在第三个位置,下标为2 。当数字 n 或 0 && nums[i] != i + 1) { if
阅读全文
摘要:"40. 组合总和 II" 这题跟上题做法几乎一样,只不过每个数能取多次改成了最多能取一次,同时candidates可能会出现相同字符,感觉还没有上一个题难。 代码仅需改两处即可,直接看代码把,有注释的地方即是改过的 class Solution { public List combinationS
阅读全文
摘要:"39. 组合总和" 直接暴力思路,用dfs+回溯枚举所有可能组合情况。难点在于每个数可取无数次。 我的枚举思路是: 外层枚举答案数组的长度,即枚举解中的数字个数,从1个开始,到target/ min(candidates)终止。 然后内层就可以dfs搜索了, 缕清状态的转换与回溯,题就做出来了。
阅读全文
摘要:"38. 报数" 水题
阅读全文
摘要:"37. 解数独" 1A 这个题其实15分钟左右就敲出来并且对了。。。但是由于我输错了一个数。。导致我白白debug一个多小时。。 没啥难度,练递归 dfs的好题 class Solution { private int which(int i, int j) { if (i
阅读全文
摘要:"非阻塞同步算法与CAS(Compare and Swap)无锁算法" 这篇问题对java的CAS讲的非常透彻! 锁的代价 1. 内核态的锁的时候需要操作系统进行一次上下文切换,加锁、释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,cpu之前缓存的指令和
阅读全文
摘要:最近事情比较少,闲暇之余温习巩固一下Java的一些基础知识,并做一些笔记, Java常用集合, 主要参考的这篇文章: "Java常用集合" ArrayList/Vertor 1. ArrayList 的主要消耗是数组扩容以及在指定位置添加数据,在日常使用时最好是指定大小,尽量减少扩容。更要减少在指定
阅读全文
摘要:"你应该知道的 volatile 关键字" 当一个变量被 volatile 修饰时,任何线程对它的写操作都会立即刷新到主内存中,并且会强制让缓存了该变量的线程中的数据清空,必须从主内存重新读取最新数据。 volatile 修饰之后并不是让线程直接从主内存中获取数据,依然需要将变量拷贝到工作内存中。
阅读全文
摘要:"869. 重新排序得到 2 的幂" 枚举排列,然后验证。比较暴力。 其实好一点的做法应该反过来,先把int范围下的2的N幂算出来,然后一个一个验证给出的数能不能拼成。 class Solution { public Integer[] nextPermutation(Integer[] nums)
阅读全文
摘要:"868. 二进制间距" 读懂题意就出来了 class Solution { public int binaryGap(int N) { String s = Integer.toBinaryString(N); int ans = 0; int k = 1; int i = 0; while (s
阅读全文
摘要:没啥好说的,直接上就行 "36. 有效的数独" class Solution { public boolean isValidSudoku(char[][] board) { Map map = new HashMap(); for (int i = 0; i
阅读全文
摘要:"35. 搜索插入位置" 二分,太简单,没啥好说的
阅读全文
摘要:"34. 在排序数组中查找元素的第一个和最后一个位置" 题目要求用O(logn),明显要用二分。 其实二分不难,难的是要处理好边界 class Solution { public int[] searchRange(int[] nums, int target) { int i = 0, j = n
阅读全文
摘要:"33. 搜索旋转排序数组" 说实话这题我连题都没有看懂。。。。真是醉了 二分,没意思,直接交了 https://www.jiuzhang.com/solutions/search in rotated sorted array/ tag other
阅读全文
摘要:"32. 最长有效括号" 这个题挺有意思,思路有些巧。硬上是不行的。 很明显,遇到括号匹配问题一定要从栈开始思考 说白了,这就是一个匹配消除的游戏,我给大家举个例子演示一波大家就看明白了,也就知道怎么做了 假设输入数列几位S 基本解法是维护一个栈,从S第一个元素开始一次扫描 1. 当碰到(,入栈 2
阅读全文
摘要:Guava Cache,网上介绍很多,我就不赘述了。 分享一篇好的文章: "Guava Cache内存缓存使用实践 定时异步刷新及简单抽象封装" "Google Guava 3 缓存" 在原作者基础上,我做了一些修改: 该方法不再定义为抽象方法。没必要抽象,当有使用场景的时候子类重载该方法不就完了嘛
阅读全文
摘要:使用场景 在日常开发中,我们经常会遇到需要调用外部服务和接口的场景。外部服务对于调用者来说一般都是不可靠的,尤其是在网络环境比较差的情况下,网络抖动很容易导致请求超时等异常情况,这时候就需要使用失败重试策略重新调用 API 接口来获取。重试策略在服务治理方面也有很广泛的使用,通过定时检测,来查看服务
阅读全文
摘要:"31. 下一个排列" 发现规律后很简单: 下一个排列即是要找字典序中下一个更大的排列。 如串s:1 2 3 6 5 4 2 的下一个排列是 1 2 4 2 3 5 6 我们将数字串头点即为a,尾点记作b,从右往左看找到第一个降序数字的位置记为p,如例: 在s[p+1~b]子串中找到 s[p]的最小
阅读全文
摘要:"30. 与所有单词相关联的字串" 这个题做了大概两个小时左右把。。。严重怀疑leetcode的judge机器有问题。同样的代码交出来不同的运行时长,能不能A题还得看运气? 大致思路是,给words生成一关于s的字典,用来记录每个word在s中出现的 所有 位置,注意可能会出现相同的word。然后递
阅读全文
摘要:"29. 两数相除" 感觉是目前遇到过的最‘难’过的题。。。 不让你用乘除法,看样子又是个涉及位运算的题。 上来打算暴力,只用减法,结果超时。 没啥想法,遂google了一下,发现可以用位运算左移操作,将divisor变大,直到divisor 0) { tmp = long_divisor) { w
阅读全文
摘要:"28. 实现strStr" 字符串匹配水题,边界条件需要考虑清楚。 差点想上kmp
阅读全文
摘要:"27. 移除元素" 与26题思路类似,比较简单
阅读全文
摘要:"26. 删除排序数组中的重复项" 一开始各种坐标变换把我绕晕了 ,恶心的水题 class Solution { public int removeDuplicates(int[] nums) { if (nums.length == 0) return 0; int j = 0; for (int
阅读全文
摘要:"25. k个一组翻转链表" 仍然是链表处理问题,略微复杂一点,边界条件得想清楚,画画图就会比较明确了。 reverse函数表示从 front.next节点开始,一共k个节点做反转。 即: 1 2 3 4 5 ,k = 2。当front为1时, 执行reverse后: 1 3 2 4 5 同上个题一
阅读全文
摘要:"24. 两两交换链表中的节点" 水题啊,不想说啥。分析题意,可发现两个节点切换时,需要改动的除了两个节点,还有两个节点的前一个节点。代码中middle与back,代表将要交换的两个节点。
阅读全文
摘要:"23. 合并K个排序链表" 这个题算是考察代码功底吧,基本功,对变量与引用的理解。 不多说了,思路跟第21题基本一致,只不过从两个换成了多个
阅读全文
摘要:"22. 括号生成" 谨慎后,1A的概率貌似高了些 算是20题的升级版吧, 利用递归来拼成string,然后通过 "20. 有效的括号" 该题的代码来判断生成的string合不合法 看代码吧 尼玛优化后居然比优化前慢5ms,严重怀疑leetcode评测机有毛病,代码跑多久看RP
阅读全文
摘要:"21. 合并两个有序链表" 两个有序链表合并为一个新的有序链表 class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode ans = new ListNode(Integer.MAX_VA
阅读全文
摘要:"20. 有效的括号" 括号匹配,用栈即可。高中时第一次学栈后做的第一个题。。 class Solution { public boolean isValid(String s) { Stack characterStack = new Stack(); for (int i = 0; i
阅读全文
摘要:"19. 删除链表的倒数第N个节点" 1A,开心~ 注意,题目有进阶要求,只允许扫链表1次, 很多链表题跟这个思路一样,在遍历链表的时候,维护一个距离与当前头指针为(n+1)的尾巴标记P即可,当扫到链表结尾的时候,此时P正好指向待删除节点的前一个节点 注意几个细节处理: 0:注意P的初始化 1:n
阅读全文
摘要:"18. 四数之和" 和之前的三数之和思路完全一样,只不过需要先枚举两个数,然后采用贪心的双指针法。 class Solution { public List fourSum(int[] nums, int target) { Arrays.sort(nums); int p, q; int len
阅读全文
摘要:"17. 电话号码的字母组合" 暴力即可,深搜 or 迭代
阅读全文
摘要:跟之前几个题思路大致相同, 贪心中的双指针法
阅读全文
摘要:此题相当恶心,多次超时 暴力是O(N^3),明显不会过,不用考虑。 比较好一点的思路是,a+b = c,我们可以考虑用hash表存下来每个数字是否出现以及出现的次数,枚举a与b,然后看看此时 (a+b)是否存在。O(N^3),但是,仍然超时。 至此我是想不到更优的思路了,于是开始搜别人的题解 大部分
阅读全文

浙公网安备 33010602011771号