随笔分类 -  LeetCode

LeetCode的刷题笔记
摘要:大模拟。。。烦这种题 遇到括号匹配的题目,用栈就对了。此题需要栈+Map 没啥难度,写了半天,Debug几个用例后,1A过了 class Solution { class Atom { String s; int cnt = 1; Atom(String s, int cnt) { this.s = 阅读全文
posted @ 2021-07-05 22:36 ACBingo 阅读(128) 评论(0) 推荐(0)
摘要:朴素的BFS,注意要考虑输入就是答案的情况 class Solution { class State { int[][] board; int p; int q; int cnt; State(int[][] b, int i, int j) { board = b; p = i; q = j; c 阅读全文
posted @ 2021-06-29 23:29 ACBingo 阅读(45) 评论(0) 推荐(0)
摘要:朴素BFS,擦边过。。不难,但是绕,需要想清楚。 大致描述一下做法吧,首先枚举能经过起点站的公交车,将公交车入队列。 然后对当前公交车能到达的每一站,看能否换乘其它公交车,将其它公交车入队。 注意,已经“坐过”的公交车就没有意义再坐一次了,当然,已经去过的站也没有必要再去一次了。所以有两个visit 阅读全文
posted @ 2021-06-28 23:47 ACBingo 阅读(121) 评论(0) 推荐(0)
摘要:回溯DFS 但是该递归函数并没有满足「全排列不重复」的要求,在重复的字符较多的情况下,该递归函数会生成大量重复的排列。对于任意一个空位,如果存在重复的字符,该递归函数会将它们重复填上去并继续尝试导致最后答案的重复。 解决该问题的一种较为直观的思路是,我们首先生成所有的排列,然后进行去重。而另一种思路 阅读全文
posted @ 2021-06-23 22:36 ACBingo 阅读(48) 评论(0) 推荐(0)
摘要:下一个值覆盖当前值即可。。 class Solution { public void deleteNode(ListNode node) { while (node.next.next != null) { node.val = node.next.val; node = node.next; } 阅读全文
posted @ 2021-06-15 12:37 ACBingo 阅读(35) 评论(0) 推荐(0)
摘要:链表形式的大数相加,没什么难的 题目要求不能修改原链表。那就把两个链表遍历一遍,把数取出来放到stack里,再进行相加 或者利用递归?(不过也是一样的,自己构建的栈只是换成了递归栈) class Solution { public ListNode addTwoNumbers(ListNode l1 阅读全文
posted @ 2021-06-15 12:29 ACBingo 阅读(46) 评论(0) 推荐(0)
摘要:二分的一种变种,这次是比较条件改变了,相邻的两位来比较,进而判断左右区间的选择 class Solution { public int peakIndexInMountainArray(int[] arr) { int n = arr.length; int left = 1, right = n 阅读全文
posted @ 2021-06-15 00:26 ACBingo 阅读(29) 评论(0) 推荐(0)
摘要:二分寻找边界 public class Solution extends VersionControl { public int firstBadVersion(int n) { int i = 1; int j = n; while (i<=j) { int mid = i + ((j-i)>>1 阅读全文
posted @ 2021-06-15 00:05 ACBingo 阅读(52) 评论(0) 推荐(0)
摘要:考察二分的一种写法,注意数据的溢出 public class Solution extends GuessGame { public int guessNumber(int n) { int left = 1; int right = n; while (left <= right) { int m 阅读全文
posted @ 2021-06-14 23:55 ACBingo 阅读(38) 评论(0) 推荐(0)
摘要:494. 目标和 一看数据最多才20个,直接暴力DFS感觉能过,没想到真过了o(╯□╰)o class Solution { int ans = 0; public int findTargetSumWays(int[] nums, int target) { int n = nums.length 阅读全文
posted @ 2021-06-07 00:14 ACBingo 阅读(50) 评论(0) 推荐(0)
摘要:上一个题的变种,改了一下,果然超时,然后在dfs的时候加一些剪枝,仍然超时。。。 因为太晚了,实在不想自己想了,所以看了下题解,果然是要用动态规划来做。 大致思路是k[0][j]表示,当前从0节点出发,到j节点,最少的分隔数。那么得到k[0][j]的递归公式就是 : Min(k[0][t])+1,t 阅读全文
posted @ 2021-06-07 00:01 ACBingo 阅读(49) 评论(0) 推荐(0)
摘要:中等题,别看挺简单,能很快写出来代码蛮难的,后面可以用作面试考察题 大致思路遍历链表,对于每一次遍历i,将当前节点从链表上摘除,然后从链表开头到i节点:[head,i),寻找可以插入的位置。注意要处理边界情况:1. 可能插在了当前head节点前面 2. 当i节点的val比[head,i)中所有节点都 阅读全文
posted @ 2021-06-07 00:00 ACBingo 阅读(54) 评论(0) 推荐(0)
摘要:题目不难理解,可以将问题转化成判断O构成的连通区域,是否有位于边界的块。 直接用朴素的BFS解决问题。BFS时要向上下左右四个方向都走,走过的块记录的list中,走的同时判断如果有位于边界的块,flag记为true 最后BFS完成后,如果是 false,那么就可以把list中记录的块置为X了;如果f 阅读全文
posted @ 2021-06-06 23:58 ACBingo 阅读(61) 评论(0) 推荐(0)
摘要:考察栈的使用,需要注意边界情况。不难,想全TestCase很容易1A通过 class Solution { public String reverseParentheses(String s) { Stack<Character> stack = new Stack<>(); if (s.lengt 阅读全文
posted @ 2021-06-06 23:56 ACBingo 阅读(47) 评论(0) 推荐(0)
摘要:首先标记出所有的回文子串。boolean f[i][j]表示下标[i,j]构成的子串是回文串。 使用中心扩展法来算出整个f数组:枚举每一个下标为回文串的中心,然后逐渐向两边尽可能的扩展。最终O(n^2)跑完f数组。 然后使用dfs枚举出所有可能性 粗心了一下,可惜没有1A class Solutio 阅读全文
posted @ 2021-06-06 23:55 ACBingo 阅读(53) 评论(0) 推荐(0)
摘要:蛮简单的一个题,位运算 public int hammingDistance(int x, int y) { int cnt = 0; while (x>0&&y>0) { int a = x & 1; int b = y & 1; if (a!=b) cnt++; x>>=1; y>>=1; } 阅读全文
posted @ 2021-06-06 23:53 ACBingo 阅读(29) 评论(0) 推荐(0)
摘要:矩阵前缀和。因为矩阵中可能包含负值,所以这题肯定不会存在什么剪枝,动态规划的可能性。所以这个题也就没什么弯弯绕绕。个人感觉算不上个Hard题目。 最直观的思路就是枚举子矩阵,既枚举矩阵的左上角节点和右下角节点所构成的子矩阵。枚举是4层循环。 然后矩阵和的计算是两层循环,肯定不能套在枚举子矩阵的循环里 阅读全文
posted @ 2021-06-06 23:50 ACBingo 阅读(64) 评论(0) 推荐(0)
摘要:前缀和问题。题目很好理解,读完题我们可以很迅速的想到利用前缀和实现O(n^2)的算法 其实,题目要求只统计满足k的子序列个数。所以当我们遍历到i时,prefix[i] + x = k,所以我们只需要知道x这个值出现了几次,就能统计出i节点所能构成的答案。借用Map结构就能很轻易得到。 最终一次遍历就 阅读全文
posted @ 2021-06-06 23:49 ACBingo 阅读(84) 评论(0) 推荐(0)
摘要:位运算 231. 2 的幂 ``` class Solution { public boolean isPowerOfTwo(int n) { int cnt = 0; while (n>0) { if ((n & 1) == 1) cnt++; n >>= 1; } return cnt == 1 阅读全文
posted @ 2021-06-06 23:48 ACBingo 阅读(40) 评论(0) 推荐(0)
摘要:这个题感觉很不错,链表中的部分反转问题、快慢指针问题都可以考察到。 首先,利用快慢指针,找到链表的中位节点,然后对后半部分链表反转。然后对前半部分链表隔一个插入一个就可以了。 143. 重排链表 ``` class Solution { public void reorderList(ListNod 阅读全文
posted @ 2021-06-06 23:47 ACBingo 阅读(53) 评论(0) 推荐(0)