自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 3008. Find Beautiful Indices in the Given Array II

当我们走到f这个数字的时候,在haystack那边我们已经走到了最后一个d,但是d和f匹配不上,然后已知的是之前匹配过了abc了,所以j = next[j - 1] 会返回的,不是上一个abc最后的位置c,而是走完了上一次abc之后的东西。假设扫描haystack的指针是i,扫描needle的指针是j,在匹配不上的时候,kmp的处理逻辑i不动,是 j = next[j - 1],这里的意思指的是。这题最难的部分其实就是第一个部分的strstr,根据数据量的要求,只能是kmp(或者更高级的)。

2024-01-26 15:30:35 360

原创 Task Scheduler

如果仅考虑A的情况,那么出任务的结果就是AIIAIIAIIA,其中I表示idle的意思你可以发现在这种情况下,idle出现的次数就是(A出现的次数 - 1)* n。譬如说4个A之间,只有三个idle空间,这三个idle空间你不可能再塞4个B,所以你能减掉的数目是min(idle区间数,task出现次数),也就是你即使遍历到B,你也不能从idle剩余数目里减掉4个,只能减掉3个。你可以看出来剩余的tasks的数量超过了idle的数目了,而且task的种类也超过了中间的idle的数目。我们随便取一个就可以了。

2022-08-22 15:28:45 1253 1

原创 Longest Repeating Character Replacement

Window只扩大不缩小。譬如说当K = 3的时候,你有一个abcdffesdaf,那么譬如abcd或者cdffe之类的都是符合条件的Window,因为abcd有四个字符,出现最多的单个字符的长度也只有1,那么你可以同时replace 4 - 1 = 3个使之成为一个有效的window,cdffe也类似,出现最多的单个字符是f,出现了两次,+3 = 5,也是有效的。如果你想一直维持一个有效的window,那么你必须在遍历的时候永远知道当前window里出现最多的字符是什么,出现最多的次数是多少。...

2022-08-05 17:21:11 147 1

原创 [LC] 489. Robot Room Cleaner

https://leetcode.com/problems/robot-room-cleaner/这一题,我第一次面fb的时候,被挂过。所以还是想过一下的。这题只能dfs做,因为它的限制就是你只能一格格一步步走,没办法像bfs所需要的那样跳着格子一层层的走。所以你要做的就是每到一个格子,就四个方向走,同时用某种方式记录你走过的位置以免重复走,但是你这玩意儿,它还需要回头走回你来的方向的...

2019-12-17 15:45:12 223

原创 [LC] 480. Sliding Window Median

https://leetcode.com/problems/sliding-window-median/这题就是这一题的延伸版本:https://blog.csdn.net/chaochen1407/article/details/82688222可以直接在这一题的原做法上加一个删除的操作即可。就是当这个window走过一个元素,就从两边的queue中某个删除掉就可以了。但是从prio...

2019-12-17 02:08:15 158

原创 [LC]463. Island Perimeter

这题是easy题,所以很easy。不过,还是有点可以取巧的地方。最开始的最naive的做法就是走完整个方阵,走到每个方格的时候,首先设置基础周长为4,因为周围四个边。然后看上下左右四个方向有没有方格, 有的话就减一。然后得到的数字加到结果里即可。根据这个算法可以得到代码如下: public int islandPerimeter(int[][] grid) { ...

2019-12-16 12:45:15 118

原创 [LC] 452. Minimum Number of Arrows to Burst Balloons

https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/这一题让我想起了另一题,如果在一群schedule里面得到所需的最少的meeting room。https://blog.csdn.net/chaochen1407/article/details/81282319那一题本质就是找最大的ove...

2019-12-16 12:36:16 306

原创 [LC] 449. Serialize and Deserialize BST

https://leetcode.com/problems/serialize-and-deserialize-bst/一般来说serialize和deserialize的要求就是这个数据能够完整且表示唯一的数据结构。有点像充要条件的意思。对于一般的binary tree,充要条件可能为一个preorder的数组和inorder的数组,也可能为一个inorder的数组和一个postorde...

2019-12-16 10:00:27 117

原创 [LC] 442. Find All Duplicates in an Array

看到最初始的条件,1 <= a[i] <= n (n = size of array)。我最开始能够想到的是https://blog.csdn.net/chaochen1407/article/details/43230993上面这种做法的根本就是让众神归位,就是把数字放到放到它该呆的位置,也就是把num放到arr[num - 1],然后上面那题,是找到不存在的数字,而这一题,...

2019-12-16 09:08:18 89

原创 [LC] 438. Find All Anagrams in a String

https://leetcode.com/problems/find-all-anagrams-in-a-string/这一题,其实和很多题目都一样或者类似,先通过字符串p算出一个字符table, 然后就是维持一个window,数一下window里面各个字符有多少,然后匹配到p字符串的字符table,如果相同就记录。代码如下: public List<Integer&gt...

2019-12-16 08:02:47 91

原创 [LC] 430. Flatten a Multilevel Doubly Linked List

https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/这题其实是非常直观的dfs题目,每次遇到child的时候,进入下一层dfs,这个dfs需要返回两个点,一个是child list的头,另一个是child list的尾。此时遍历到的这个节点的next就会成为child list的头,child list...

2019-12-16 07:54:02 97

原创 [LC] 428. Serialize and Deserialize N-ary Tree

https://leetcode.com/problems/serialize-and-deserialize-n-ary-tree/实话说在我心目中leetcode里面的题目,有些hard是属于需要很巧妙的解法,有些hard是属于很烦但是不太涉及很巧妙的算法。这一题就属于很麻烦的那一种。其实这样的serialize和deserialize核心算法还是bfs或者dfs,题目的描述里其实...

2019-12-15 18:46:40 217

原创 [LC] 426. Convert Binary Search Tree to Sorted Doubly Linked List

BST换排好序的任何数据结构用脚趾头想都应该是inorder的dfs。这里也就是dfs中间穿插一些前后连接的操作就行了。给出两种解法,一个是递归做的,一个是用Stack做的。(意想不到的是递归的比Stack的要快) public Node treeToDoublyList(Node root) { if (root == null) return null;...

2019-12-15 12:22:09 104

原创 [LC] 419. Battleships in a Board

正常来说,这种找一个图里面有多少个island的题目都是用什么dfs来做的。就是dfs走遍一个island或者battleship然后mark visited之类的。这题也是可以的。当然follow up就肯定不是这样了。这题给了一个很给力的条件,就是所有的battleship都是一条线。要不就是直的,要不就是横的,并且任意两条船之间,都有空位,不能相邻。所以这个时候,其实我们只需要找到每条b...

2019-12-15 11:19:04 171

原创 [LC] 417. Pacific Atlantic Water Flow

这一题是一题有点典型又有点非典型的图论题典型在于它除了BFS或者DFS然后记录visited之外没有什么高级货。非典型在于一般我们都在图内的某些特异点进行dfs或者bfs,我最开始考虑的是图上每个点做dfs然后从中间点往两边海域自下而上的dfs,一旦遇到比自己高的点就停下来,如果遇到边界就自下而上返回true这样。可是这会存在一个无法解决的问题就是,如果存在同样高度的点,你是没办法把它记录成...

2019-11-20 18:22:34 104

原创 [LC] 416. Partition Equal Subset Sum

这题是0-1背包问题的变种,类似的还有另一题是完全背包问题是https://blog.csdn.net/chaochen1407/article/details/90767890。当初没认出来它其实是一个完全背包问题。主要是自己对背包问题也没有很好的学习过。这题需要一定的转换才能看成是一个背包问题。它题意的意思是可以把这个array变成两个不重叠的部分,两个部分的和是一样的。所以,任意一...

2019-11-17 08:32:40 97

原创 [LC] 328. Odd Even Linked List

https://leetcode.com/problems/odd-even-linked-list/很久没有试过不看提示自己很快解决一道medium题了,今天终于搞定了一道。也不知道是不是因为太简单了。。这题一个很直接的一个想法就是将链表先分拆成两条链,一条odds链一条even链然后odds链连接even链就可以了。关键就是如何分拆了。我看到这题目的时候让我有点想到当年我遇到的第一条...

2019-11-07 17:39:12 112

原创 [LC] 405. Convert a Number to Hexadecimal

https://leetcode.com/problems/convert-a-number-to-hexadecimal/嗯,就因为开头那一句负数参考补码,我研究了半天的补码。然后我发现...其实根本就不是那么回事。如果这一题不允许负数的话,最直观的想法就是不停的模16然后除以16即可。然后看了看补码,想该怎么变换数字才能够继续这种无脑模16除16,发现这样做真的很复杂。所以换一种思维...

2019-11-07 16:48:08 89

原创 [LC] 398. Random Pick Index

https://leetcode.com/problems/random-pick-index/Well.. 这一题,直白的方法太多了。譬如直接扣一个Map<Integer, List<Integer>>的cache,然后每次就先从map里面找到那个index list,然后用Random.nextInt选出来就好。这个方法构造函数是O(n)的,然后pick是O(1...

2019-11-07 16:07:03 156

原创 [LC] 394. Decode String

https://leetcode.com/problems/decode-string/这一题给的条件太友善了,主要是没有3a或者2[4]这样的输出,这样逻辑判断就很简单了。因为中括号允许内部嵌套,这样的话最好的方式还是自下而上的dfs递归会比较方便。用一个全局的遍历计数器,然后基本就是分几个case1. 遇到0 ~ 9,就算进一个counter里表示对下一层递归返回的字符串重复多少次...

2019-11-07 15:32:47 155

原创 [LC] 388. Longest Absolute File Path

这种文件系统的题目很大程度上都是依赖于Stack来解决问题的。这一题也是,你用Stack来表示现在是第几级别的子文件夹。这一题有一个隐含条件就是子文件夹的级数的增加是一级级递增的(减少并不是)。如果我们用隔行符(\n)作为字符分割的字符的话。我们得到的每一个子字符串就是一条path记录。因为是一级级递增的,所以你不会存在现在这个path是\t\t\dirA,然后下一个\t\t\t\t\dirB...

2019-11-02 00:22:42 106

原创 [LC] 312. Burst Balloons (先只放代码, 具体分析稍后再放)

这一题是dp题,具体可以参考https://www.cnblogs.com/grandyang/p/5006441.html这一段代码是我自己的,尽量没有用到额外的空间。 public int maxCoins(int[] nums) { if (nums.length == 0) return 0; int[][] dp = new i...

2019-10-28 07:47:45 85

原创 [LC] 387. First Unique Character in a String

这题,=。= easy的。可以。思路就很简单了:iterate两遍,一遍统计字符出现数目,第二次遍历看对应字符出现的次数有多少,返回第一个出现只有一次的字符。 public int firstUniqChar(String s) { char[] cache = s.toCharArray(); int[] counters = new int[26...

2019-10-07 08:07:09 91

原创 [LC] 381. Insert Delete GetRandom O(1) - Duplicates allowed

这一题和https://blog.csdn.net/chaochen1407/article/details/102067676只有两行之差。Duplicates allowed和linear related。这意思就是我可以多次插入一个元素并且根据我插入的次数它被random picked的概率也会相对应提高。譬如我insert(1) insert(2) insert(2),在这种情...

2019-10-07 08:00:36 99

原创 [LC] 380. Insert Delete GetRandom O(1)

这题找对数据结构并没有很复杂。insert()需要O(1)并不能带来很多的提示,remove(int val)需要O(1)就比较明显了,如果你移除一个值而不是对应的位置需要O(1),那最容易做到的应该就是HashMap/HashSet了。然后你需要getRandom是O(1)的话就意味着你需要一个可以O(1)做到random access的数据结构,也就是数组array。所以目前看来你需要的就...

2019-10-04 15:07:10 116

原创 [LC] 378. Kth Smallest Element in a Sorted Matrix

感觉自己在这题上面是砸了很长的一段时间啊。这题目前来说可以有很多种解法,其中前三种都是围绕着heap转的。1. 纯heap解。就是用一个size为k的最大堆不停遍历整个matrix就可以了,复杂度是O(n^2logk)。这种解法可以用于任何matrix,也就是解法本身没有利用任何sorted matrix的特征。但神奇的是居然也能过,没有超时 public int kthSma...

2019-10-04 01:45:31 127

原创 [LC] 358. Rearrange String k Distance Apart

这一题最主要的核心思想是贪心法。贪心的方式是这样的:在决定下一个字符的时候,总是寻找在可用的字符中(也就是上一次出现的位置距离当前遍历的位置有k的距离或者还没有使用过),还可以使用次数最多的字符。如果在运行过程中可用的字符集合为空,就表示not possible to rearrange the string,返回空字符串为了达到这种贪心法,有两种方式。1. 基于heap的做法,...

2019-09-16 15:31:11 73

原创 [LC] 350. Intersection of Two Arrays II

这一题和https://blog.csdn.net/chaochen1407/article/details/99679944其实思路是差不多的,就是加一个counter而已。同样还是两种办法:哈希表做对比统计;排序之后然后两个指针在两个数组类似merge two sorted lists或者merge two sorted arrays那样行走就可以了。第一种方法:哈希表 ...

2019-08-20 13:16:59 94

原创 [LC] 349. Intersection of Two Arrays

这题真的很没有营养,一个HashSet就能解决的问题。如果真的要变个花样不用任何空间,排个序也可以,真的没有什么好思考的,直接给代码就好了。 public int[] intersection(int[] nums1, int[] nums2) { HashSet<Integer> set = new HashSet<>(); ...

2019-08-16 15:55:59 73

原创 [LC] 348. Design Tic-Tac-Toe

这一题,我对它的follow up 其实感到略微好奇,因为我其实不知道O(n^2)是怎么做的,我只知道O(n)乃至O(1)的做法。O(n) 做法如下。第一种比较直观,需要O(n^2)的空间,用于真实装一个棋盘的数据。每次更新一个位置之后,就根据这个位置所在的位置,去检查更新位置对应的行,列,以及可能的两条对角线:col == row的左下到右上的对角或者col + row == n...

2019-08-16 15:23:53 106

原创 [LC] 347. Top K Frequent Elements

这题做法其实不止一种。最直观的做法就是用heap,在java里就是PriorityQueue。用一个大小为k的最小堆来做,对每个数字出现的次数做统计,保留出现次数最大的k个即可。当然你放在PriorityQueue里面的不能是一个简单的Integer,因为你不止要知道次数的排序,你还得知道是什么数字对应的那个次数。所以你就需要override默认的comparator才行,你Priori...

2019-08-14 15:55:46 79

原创 [LC] 345. Reverse Vowels of a String

这题真的没啥技术含量,头尾指针往中间扫,遇到元音字符就交换就好了。。直接给代码 public String reverseVowels(String s) { int head = 0, tail = s.length() - 1; HashSet<Character> vowels = new HashSet<>(); ...

2019-08-09 13:11:57 85

原创 [LC] 341. Flatten Nested List Iterator

这一题一种最直接的做法就是先真的做一个完整的flatten放到一个list里面,然后就很简单的iterate这个list就好。flatten的过程就用递归的dfs做就好了。根据这个思路,就可以得到代码如下:public class NestedIterator implements Iterator<Integer> { List<Integer> fla...

2019-08-01 16:22:25 104

原创 [LC] 340. Longest Substring with At Most K Distinct Characters

我感觉不到这一题和https://blog.csdn.net/chaochen1407/article/details/44041185有什么本质上的差别。基本都是一样的思想,用快慢指针维护一个窗口,快指针就走最普通的for循环遍历方式,然后根据窗口里面的内容确定是否推进慢指针,如果窗口里面的distinct characters已经多于k个,就开始前移慢指针缩小窗口直到窗口内的独立的字符不...

2019-07-31 00:02:23 114

原创 [LC] 339. Nested List Weight Sum

这题实在是简单的已经没法再解释啥了。最基本的图论题。想用bfs也行,用dfs也行, 只要在遍历的过程里记得自己是哪一层的即可。搞定,下面就给出dfs的代码:class Solution { public int depthSum(List<NestedInteger> nestedList) { return depthSum(nestedList, ...

2019-07-30 15:07:18 82

原创 [LC] 338. Counting Bits

先来个简单版本的答案, 就是对每个数字进行bit count。count的方法已经很烂大街了,就不阐述了。 public int[] countBits(int num) { int[] result = new int[num + 1]; for (int i = 0; i <= num; i++) { resu...

2019-07-30 14:55:30 98

原创 [LC] 336. Palindrome Pairs

这一题有着最straight forward的做法。就是把每俩个字符串组装一下然后检查一下是否是Palindrome。思路非常明白。代码如下: public List<List<Integer>> palindromePairs(String[] words) { List<List<Integer>> result ...

2019-07-29 08:25:58 385

原创 [LC] 334. Increasing Triplet Subsequence

这一题,也没有很繁杂的思路。只需要遍历一遍,并在遍历的过程里记住两个数字就行了,一个是当前最小的数字,第二个数字,如果我们称为min2,这个min2的更新条件是如果当前遍历到的数字大于最小值但小于当前的min2,便将min2更新为当前的数字。这种做法得到的min2并不是当前第二小的数字。其实和LIS的最优解做法的dp数组差不多,主要就是为了记录当前最优解所需要的数字。一旦遍历到比min2更大的...

2019-07-19 15:22:25 111

原创 [LC] 319. Bulb Switcher

这一题,点赞280,点踩637。主要原因是因为这是一道数学题,而不是算法题。先给出代码吧,就一行 public int bulbSwitch(int n) { return (int)Math.sqrt((double)n); }=。= ............. 对的,就这样。原理非常简单。首先ith盏灯被toggle 了几次,就取决于i这个...

2019-07-15 23:53:17 63

原创 [LC] 332. Reconstruct Itinerary

这一题并不是我个人很喜欢的题目类型。最优解基本就是特定的算法,知道就能过,不知道也不是你能短时间里想出来的解决方案。这题就是欧拉路径的题目,给定起点和所有边的信息,在不重复的情况下走完全图。https://ikely.me/2015/06/28/%E6%AC%A7%E6%8B%89%E8%B7%AF/https://www.cnblogs.com/KasenBob/p/9985398....

2019-07-01 12:13:10 81

空空如也

空空如也

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

TA关注的人

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