12 2016 档案
摘要:最后更新 三刷 看起来是level order traversal,但是直接硬来的话,doing this iteratively requires O(n) space for a Stack; while recursively doing this requires O(n) as well
阅读全文
摘要:刷 June 12 2019 直观做法是保持滑窗,滑窗内出现的字母用MAP记录位置。 单向扩大滑窗,发现已出现字母,要查上次出现的位置,移动左指针。 一开始考虑的是移动左指针之后,要从MAP中删除移动过程中的字母,其实不用, 因为继续的时候,发现MAP中的字母出现在滑窗外,证明是应该被删除的,所以需
阅读全文
摘要:最后更新 二刷 木有头绪啊。。 看答案明白了。 用的是two sum的思路。 比如最终找到一个区间,[i,j]满足sum = k,这个去见可以看做是 [0,j]的sum 减去 [0,i]的Sum. 维护一个map,来记录0 i的和,我们希望 0~i + k = 0 ~ j ,这样就可以更新一次i~j
阅读全文
摘要:刷 June 12 2019 O(n)做就是滑窗,本质还是利用了单调性。左右指针固定只能移动左边,因为移动右边+1肯定不是最优解。2pointer还要再体会下。 follow up要求 O(NlgN) lgN一般是二分,N次二分= =但是没仔细想。看了下答案原来是 sum[n]代表1 n的和 遍历1
阅读全文
摘要:最后更新 二刷 这个题做得真蠢。上来想的复杂了,想的是quick sort之类的,然后一个一个交换。 实际上直接交换就行。。没啥特别的。 回头看一刷也是同样的思考过程= =宿命论啊。。 Time: O(n) Space: O(1) java public class Solution { publi
阅读全文
摘要:最后更新 一刷 还是Partition,只不过这次是按照大小写字母来。 java public class Solution { public void sortLetters(char[] chars) { //write your code here if (chars.length = max
阅读全文
摘要:最后更新 一刷 java class Solution { public void sortColors2(int[] colors, int k) { // write your code here if (colors.length
阅读全文
摘要:最后更新 四刷(我怎么觉得三刷没做完就四刷了。。) 典型的Partition,总结出一个general的方法了。 Time: O(n) java public class Solution { public void sortColors(int[] nums) { if (nums.length
阅读全文
摘要:最后更新 二刷 看到这个题有点懵逼。 第一反应是二分,马上觉得不对,又觉得从右上开始(因为做过类似的),也不行。 回头看一刷答案发现居然是,直接PQ。。。。 max Heap就可以了,注意某些时候是可以break的。 到某一个点的时候,能保证比这个点小的元素多于K,就没必要继续添加了。 判断式是(i
阅读全文
摘要:最后更新 四刷? K largest什么的题是面试的高频题,这次尝试搞清楚。 首先是双指针,锁定区间,每次找一个pivot,然后按这个分边。 我是选一个pivot,然后比Pivot大的放左边,小的放右边,然后看看K落在P的左边还是右边,来缩小区间。 最坏的情况每次都找到最小的元素,而我们需要最大的(
阅读全文
摘要:最后更新 一刷。 双指针夹逼。 容器的高度受限于较小的边,夹的时候底在变小,所以移动较大的边没有意义,最终高度还是小的那边;只能尝试移动小的那个边。 java public class Solution { public int maxArea(int[] heights) { // write y
阅读全文
摘要:最后更新 三刷。 还是双指针。 因为不用查重了,反而简单了。每次遇到更接近的值更新一下。 java public class Solution { public int threeSumClosest(int[] nums, int target) { int res = 0; int diff =
阅读全文
摘要:最后更新 二刷。。 其实没那么简单。。。 可以维持2个set,一个是所有的elements,一个存放可组合的所有sum,每次add的时候更新2个set,这样find是O(1),然而TLE了。。 另一个做法是添加直接加,然后查的时候看看能不能组合出来所需要的值。 edge case着实难想到= = a
阅读全文
摘要:最后更新 二刷。。至少是二刷。。 感觉linked list的题可操作性都比较小,基本都是楞做,难在edge cases上,一般通过dummy这种可以解决烦恼。。 这个题就俩HEAD代表ODD和EVEN就行了。。 最后别忘了odd的尾连着even的头,even的尾指向NULL。 否则就成环了,这个题
阅读全文
摘要:最后更新 一刷。 这个题不像是一刷,Hedvig的面经题。 K largest之类的题一般都可以用priority queue。 这里PQ里存的是,每个LIST的首NODE。 可以考虑divide and conquer,中文好像叫分治递归?这里的K个sorted lists已经给我们分治好了,我们
阅读全文
摘要:最后更新 二刷。 这个题挺难的啊。。 首先找到需要翻转的位置。 有prev和temp两个node, 思路是把范围内的node放到prev和temp之间。。 这里的temp其实是翻转区间的尾端,用tail表示。 所以prev和tail这2个NODE是指着不动的。 首先找到下一个塞入他们之间的node:
阅读全文
摘要:最后更新 三刷。 某一个状态下不能赢,说明上一个状态赢了,上上个状态输了,上上上个状态赢了。。但是越往上状态越是不一定的。。 所谓的状态其实就是input的情况。 这个题更像是DFS+状态记录,只不过提前结束的情况比较早。 java public class Solution { Map map =
阅读全文
摘要:最后更新 这是几刷。 唯一值得说道的是,添加的时候可以用. s.substring(0, i) + " " + s.substring(i+1); 也可以弄成char[] array来修改。 第二种快。 java public class Solution { public List generat
阅读全文
摘要:刷 Aug 01 2019 居然都4刷了,除了记得我做过之外完全没印象。 居然做出来了。。 对于n来说,我可以选1~n里任意一个,比如我选了3,对方一定会说答案在 [1~2]或者[4~n]中较大的那边,所以还是个MinMax题,总算稍微了有了点MinMax的感觉。 但是1~n选哪个要遍历才行。。 d
阅读全文
摘要:刷 July 31 2019 这种题遇到就两腿一蹬,地上一躺。 和coins in a line I除了名字很像,没啥屌关系,如果真的作为I的follow up,就太坑了,因为根本不是FOLLOW UP,用1的思路去考虑就崩了。 dp[n]代表剩下n个硬币的时候的最大收益。 n的时候,有2种情况,可
阅读全文
摘要:最后更新 一刷。 用数学方法是看是不是3的倍数。 不用数学方法的话要动态规划。 当前玩家,dp[i]行不行取决于dp[i 1]和dp[i 2],代表下一个玩家能不能赢,另一个玩家能赢的话当前就不能赢;另一个玩家不能赢,当前就能赢。 因为当前玩家可以通过拿1个或者拿2个来左右结果。 dp[i] = !
阅读全文
摘要:刷 July 29 2019 以i j为当前位置,它为右下角组成的最大的正方形是,如果上左斜上3个位置都是1,那么它的最大长度取决于刚才3个点里面最小的+它自己的1. 就是这个DP规则,不是很难。 理论上说这种二维的DP,只需要2行或者2列作为DP保存上一轮的值就行,就是滚动。 OLD 用DP. T
阅读全文
摘要:最后更新 二刷? 和小机器人走路径差不多= = 这个可以在原有的盘子上更新= = 如果不是只读。 Time : O(N) + O(M) + O(M N) Space: in place java public class Solution { public int minPathSum(int[][
阅读全文
摘要:最后更新 四刷? 依然是尝试用一维DP。 每次更新DP的时候相当于直接添加了2个方向的贡献值。 开始的dp[1] = 1不好理解,其实是代表每行第一个格子dp[j]来自左边的贡献值,来自上面的贡献值是他本身,我们在上一行算过,所以是dp[j] + 1。 下个格子dp[j+1]就变成了来自左边的贡献值
阅读全文
摘要:机器人走棋盘,左上到右下。 比较典型的动态规划,某个格的情况无非是从上面或者从左边来,两者相加就行。 Java public class Solution { public int uniquePaths(int m, int n) { int[][] dp = new int[m][n]; dp[
阅读全文
摘要:就是看哪个文件的绝对路径最长,不是看最深,是看最长,跟文件夹名,文件名都有关。 \n表示一波,可能存在一个文件,可能只有文件夹,但是我们需要检测. 之后的\t表示层数。 思路是如果当前层数多余已经有的层数说明是在go deeper,就继续,否则就要回到他属于的父目录,这个性质用STACK来实现再好不
阅读全文
摘要:一刷。 这个题还是挺难的= =有一点需要利用的就是数组长度和数组里面数的值域关系。 数组长度是n,那么数字只可以是1 n。 做法是手动排序,把数字放到相应位置。 超出数组范围的 n or 0,不动。 可以放到相应位置的,放之前看看是不是有重复的,有点话不动= =;没有就和那个位置的元素互换位置。 最
阅读全文
摘要:看起来像backtrack。。 实际上也就是。 有一个TEST CASE令我们必须先判断String是不是可分的,从而导致我不得不把word break I的办法拿来用,正好复习下。。 java public class Solution { public List wordBreak(String
阅读全文
摘要:二刷。 牛逼,二刷上来就是backtrack,TLE,时间应该是指数级别的。。 看一刷说的是DP,才想起来。 正好又学习巩固了一下DP。感觉DP套路太多了,每道题都不一样,至少LC上是这样的,很难说总结出什么规律。 按照CodeGanker的路子来: 1.确定可以保存的信息 2.递推式(以及如何在递
阅读全文
摘要:这个题比想象的容易,尤其是看了hints之后。 本质是要保留窗内元素的ORDER,并且删除元素时不影响ORDER。 说实话如果不看HINTS之后比较难想到,看了HINT就很容易了。 一个queue,保存index,删除从head删,添加从tail添加。 每次要保证head是最大的。 比如 6 2 1
阅读全文
摘要:刷 July 12 2019 前面123刷逼逼一大堆什么乱七八糟的。。 暴力O(nn) 正确的做法是backtrack. 回文判断从中间判断比较划算,因为一旦失败,就没有继续往外判断的意义了,可以back track。 所以就遍历,从遍历的位置为中心往两边判断。 需要注意,ABA ABBA这俩都算回
阅读全文
摘要:最长连续区间,如果可以SORT就太容易了。 SORT的目的是把连续的放到一起,便于我们遍历,我们可以手动完成这个过程。。 用MAP,先全都加进去,然后遍历原数组,往大小2个方向找,比较长度,找到了要REMOVE到,要不以后重复寻找了。 做了一般突然感觉不需要MAP,SET就可以,因为KEY和VALU
阅读全文
摘要:找到第N大的数,或者第N小的数。 先排序再nums[n]就是答案,不过nlgn 要求必须n 就得用quick select 其实是quick sort的变种。 quick sort每次选PIVOT,然后分成2边,再分别SORT两边。 这里就没必要了,我们要找第N大的,每次SORT完,看N在PIVOT
阅读全文
摘要:经过昨天的消沉 今天我振作了 设计个数据结构,添加,删除,随机获取都是O(1). 怎么会有这么牛逼的数据结构,所以肯定相应的要耗费空间。 添加和获取耗时O(1)是Array的特性,或者说是Map/Table的特性,思考下php的array就明白其实是index的mapping了。 Random要求O
阅读全文
摘要:刷 June 21 2019 最早的时候被边界条件各种恶心。 YLNR大法,注意最后的边界。 java public int[] searchRange(int[] nums, int target) { if (nums == null || nums.length == 0 || nums[0]
阅读全文
摘要:刷 June 22 2019 二分,通过单调性来判断该舍弃哪一半。 需要注意的就是edge case,其实l + 1 nums[r] ? l : r; } ```
阅读全文
摘要:这个和 I 、II 比不是一个级别的。。 I找数组里有没有重复的,用HashSet判定就行。 II是有没有重复,然后重复俩元素距离小于K。 用HashTable,KEY是元素,VALUE是坐标,遍历数组遇到存在于TABLE中的元素,返还那个元素的坐标,和当前比较,如果小于K,就TRUE;否则用当前元
阅读全文
摘要:刷 June 27 2019 比较难= = 用indegree的思路来做的,或者说拓扑的思路topological sort prevStr和tempStr,说明prevStr里的char在tempStr里的char之前. eg: abc&abd = d c 说明D前面有一个C 要给所有出现的cha
阅读全文
摘要:二刷。 还是部分遍历+滑窗。 难点在于如何跳过重复的元素。 滑窗过程中遇到重复元素,和前2个固定坐标遇到重复元素是不一样的。 So u shall handle them in different ways respectively. 滑窗过程中,一旦判定成功,左右坐标的下一个如果相同,都没有判断的
阅读全文
摘要:和那个4 SUM没啥区别。。。 排序,遍历固定左边,右边2个滑窗从最大往中间滑。 主要就是重复的处理: 一个是找到一个有效组合后,要继续滑,不能BREAK,然后继续滑之前跳过重复; while(L threeSum(int[] nums) { List res = new ArrayList ();
阅读全文
摘要:刷 July 11 2019 这个大概没H的难度。 只有加减的话,主要的麻烦在于处理括号,然后用STACK好像是共识了。。 唯一需要注意的是括号会造成变号,因为只有加减,+ 其实就是 1 1的区别。 遇到(先当前sign进栈,再当前res进栈,然后res = 0当做一个新的式子重新算,直到发现)出栈
阅读全文
摘要:刷 July 11 2019 跟带括号的区别还是蛮大的。 还是用了STACK,存所有+ 的数,碰到 /就先POP出来算完再PUSH进去。 java class Solution { private static final char INITIAL_SIGN = '+'; public int ca
阅读全文
摘要:三刷。 准备面试正好有这个题,把3种方式都撸一下试试。 先是Bucket Sort。因为我们知道所有数据(frequency)的值域:最小是0,element在数组中一次都未出现;最大是数组长度,整个数组只含此element,有了值域就适合Bucket。 前面按出现频率建map,记录每个int出现了
阅读全文
摘要:入手的时候一直想打破表面,发现数学本质,结果并没有发现什么数学本质,直接去找答案。 挺复杂的,一般H的题如果我面试的时候遇到,用成语形容可能出现的情况,就是我 可能会吃屎 。这题对我来说是 一定会吃屎 。 dietpepsi给的答案很详细。 首先,一排气球左边是L,右边是R,我们可以假设最后一个打爆
阅读全文
摘要:刷 July 14 2019 日他妈好难啊 第一种做法,就是类似于palindrome partition那样,枚举出所有可能,选一个substring数目最少的。 第二种做法DP,看到DP真几把绝望。 minCut[n]代表0~n的substring最少能切多少下,使所有substring都是pa
阅读全文
摘要:最后更新 三刷? 找矩阵里的最长路径。 看起来是DFS,实际上也就是。但是如果从每个点都进行一次DFS然后保留最大的话,会超时。 这里需要结合DP,dp[i][j]表示以此点开始的最长路径,这样每次碰到的时候,如果已经算过,可以直接调取这个值。 用空间交换了部分时间。 写的时候我吸取教训,把边界判断
阅读全文
摘要:刷 July 25 2019 DP题做了几道我也发现共性了,就是每道我都不会。 这道题要这么想: n位置的最优解是cost[n]里最小的+best[n 1]。问题出在,当前K中里最便宜的情况,有可能和n 1最优解时的颜色一样,在遍历cost[0~k]的时候,如果颜色和上次最优解一样,就要当前COST
阅读全文
摘要:比较典型的动态规划。 如果把重点放在当前房子和上一个相同,还是不同来做就做不出来,所以干脆枚举每个房子的情况。 dp[i][0] = costs[i][0] + Math.min(dp[i 1][1],dp[i 1][2]); dp[i][1] = costs[i][1] + Math.min(dp
阅读全文
摘要:这题有歧义啊。。说的是颜色相同的相邻数量不能超过2个,不是颜色相同的对数不能超过2个,我日了。 搞懂之后就不难了,动态规划。 每一次粉刷都有2种可能,和前一个颜色相同;和前一个颜色不同。 总和是same[n]+diff[n].. 然后,这种一维DP是不需要整个数组的,3个变量就够了,但是这么写更清楚
阅读全文
摘要:二刷吧。。不知道为什么house robbery系列我找不到笔记,不过印象中做了好几次了。 不是很难,用的post order做bottom up的运算。 对于一个Node来说,有2种情况,一种是选(自己+下下层);一种是选左右children. 其实就是选自己和不选自己的区别。其实更像是dfs的题
阅读全文
摘要:好像是二刷。 题干改变的一点就是现在所有房子成环了,首尾相连。 现在没法用动态规划来dp[n] 来做了,因为第(n 1)个房子和第1个房子是相连的。 假如我们第一个房子不抢,从n = 1开始,那么剩下的总共n 1个房子和第一题一样,因为最后一个房子此时就算选了也不和n=0(第一个)重合。 假如我们第
阅读全文
摘要:我的心好痛,有点可怜自己了,骗子啊。。好伤心。。。。为什么要骗我。 你说,霞染天光,陌上花开与谁享;后来,烟笼柳暗,湖心水动影无双。 dp[i] = Math.max(dp[i 1], dp[i 2] + nums[i]); java public class Solution { public i
阅读全文
摘要:刷 June 23 2019 先用UF做了一下,这个不容易想到。valid tree说明 UF最终只有一个group 每次加的2个node都不能发现它已经在树里了。 比如[1,2][3,4]第一个条件不满足 [1,2][2,3][1,3]第二个条件不满足 然后做就行了。其实用n + 1 == edg
阅读全文
摘要:List里可以有int或者List,然后里面的List里面可以再有List. 用Stack来做比较直观 Iterator无非是next()或者hasNext()这2个方程 一开始我想的是hasNext()就简单的返还是不是空就行,主要的操作在next()里,结果发现无线循环。。好蠢 然后看网上答案改
阅读全文

浙公网安备 33010602011771号