06 2021 档案
摘要:朴素的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
阅读全文
摘要:朴素BFS,擦边过。。不难,但是绕,需要想清楚。 大致描述一下做法吧,首先枚举能经过起点站的公交车,将公交车入队列。 然后对当前公交车能到达的每一站,看能否换乘其它公交车,将其它公交车入队。 注意,已经“坐过”的公交车就没有意义再坐一次了,当然,已经去过的站也没有必要再去一次了。所以有两个visit
阅读全文
摘要:回溯DFS 但是该递归函数并没有满足「全排列不重复」的要求,在重复的字符较多的情况下,该递归函数会生成大量重复的排列。对于任意一个空位,如果存在重复的字符,该递归函数会将它们重复填上去并继续尝试导致最后答案的重复。 解决该问题的一种较为直观的思路是,我们首先生成所有的排列,然后进行去重。而另一种思路
阅读全文
摘要:下一个值覆盖当前值即可。。 class Solution { public void deleteNode(ListNode node) { while (node.next.next != null) { node.val = node.next.val; node = node.next; }
阅读全文
摘要:链表形式的大数相加,没什么难的 题目要求不能修改原链表。那就把两个链表遍历一遍,把数取出来放到stack里,再进行相加 或者利用递归?(不过也是一样的,自己构建的栈只是换成了递归栈) class Solution { public ListNode addTwoNumbers(ListNode l1
阅读全文
摘要:二分的一种变种,这次是比较条件改变了,相邻的两位来比较,进而判断左右区间的选择 class Solution { public int peakIndexInMountainArray(int[] arr) { int n = arr.length; int left = 1, right = n
阅读全文
摘要:二分寻找边界 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
阅读全文
摘要:考察二分的一种写法,注意数据的溢出 public class Solution extends GuessGame { public int guessNumber(int n) { int left = 1; int right = n; while (left <= right) { int m
阅读全文
摘要:看来最近力扣的每日一题换成了背包啊。 这个问题并不是一个直接的背包问题,需要做一下问题转化的。 把石头尽可能的平均分成两堆,即两堆石头的总重量尽可能的相等。如果所有石头总重量和为sum的话,那么分成的两堆石头,每堆石头的重量尽可能的接近sum/2。 让这两堆石头相撞,最后剩下的最小石头,就是两堆石头
阅读全文
摘要:494. 目标和 一看数据最多才20个,直接暴力DFS感觉能过,没想到真过了o(╯□╰)o class Solution { int ans = 0; public int findTargetSumWays(int[] nums, int target) { int n = nums.length
阅读全文
摘要:上一个题的变种,改了一下,果然超时,然后在dfs的时候加一些剪枝,仍然超时。。。 因为太晚了,实在不想自己想了,所以看了下题解,果然是要用动态规划来做。 大致思路是k[0][j]表示,当前从0节点出发,到j节点,最少的分隔数。那么得到k[0][j]的递归公式就是 : Min(k[0][t])+1,t
阅读全文
摘要:中等题,别看挺简单,能很快写出来代码蛮难的,后面可以用作面试考察题 大致思路遍历链表,对于每一次遍历i,将当前节点从链表上摘除,然后从链表开头到i节点:[head,i),寻找可以插入的位置。注意要处理边界情况:1. 可能插在了当前head节点前面 2. 当i节点的val比[head,i)中所有节点都
阅读全文
摘要:题目不难理解,可以将问题转化成判断O构成的连通区域,是否有位于边界的块。 直接用朴素的BFS解决问题。BFS时要向上下左右四个方向都走,走过的块记录的list中,走的同时判断如果有位于边界的块,flag记为true 最后BFS完成后,如果是 false,那么就可以把list中记录的块置为X了;如果f
阅读全文
摘要:考察栈的使用,需要注意边界情况。不难,想全TestCase很容易1A通过 class Solution { public String reverseParentheses(String s) { Stack<Character> stack = new Stack<>(); if (s.lengt
阅读全文
摘要:首先标记出所有的回文子串。boolean f[i][j]表示下标[i,j]构成的子串是回文串。 使用中心扩展法来算出整个f数组:枚举每一个下标为回文串的中心,然后逐渐向两边尽可能的扩展。最终O(n^2)跑完f数组。 然后使用dfs枚举出所有可能性 粗心了一下,可惜没有1A class Solutio
阅读全文
摘要:蛮简单的一个题,位运算 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; }
阅读全文
摘要:在日常面试中,经常遇到有的候选人甚至连二分都写不对。你可能会说,不就是个二分吗,有啥难的?其实,不要小看二分哦,能完全写对的真的不多。 首先我们先看最朴素的二分写法: public int binarySearch(int[] a, int target) { int left = 0; int r
阅读全文
摘要:矩阵前缀和。因为矩阵中可能包含负值,所以这题肯定不会存在什么剪枝,动态规划的可能性。所以这个题也就没什么弯弯绕绕。个人感觉算不上个Hard题目。 最直观的思路就是枚举子矩阵,既枚举矩阵的左上角节点和右下角节点所构成的子矩阵。枚举是4层循环。 然后矩阵和的计算是两层循环,肯定不能套在枚举子矩阵的循环里
阅读全文
摘要:前缀和问题。题目很好理解,读完题我们可以很迅速的想到利用前缀和实现O(n^2)的算法 其实,题目要求只统计满足k的子序列个数。所以当我们遍历到i时,prefix[i] + x = k,所以我们只需要知道x这个值出现了几次,就能统计出i节点所能构成的答案。借用Map结构就能很轻易得到。 最终一次遍历就
阅读全文
摘要:位运算 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
阅读全文
摘要:这个题感觉很不错,链表中的部分反转问题、快慢指针问题都可以考察到。 首先,利用快慢指针,找到链表的中位节点,然后对后半部分链表反转。然后对前半部分链表隔一个插入一个就可以了。 143. 重排链表 ``` class Solution { public void reorderList(ListNod
阅读全文
摘要:4x 其实可以等效于 22x,所以我们仍然是通过位运算求这个2^y是多少,然后判断这个y是不是2的倍数就可以了。 class Solution { public boolean isPowerOfFour(int n) { if (n == 1) return true; int cnt = 0;
阅读全文
摘要:都儿童节了,为什么要折磨一个几百个月大的孩子? 把题意读懂挺难的。不过读懂后基本也就知道怎么做了。恶心的是int类型可能会越界,要用long类型(很难想到)。这题不好 [1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?](https://leetcode-cn.com/problems/can
阅读全文
摘要:用归并排序一个链表。 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.v
阅读全文
摘要:我会把前缀和+HashMap刻在我的DNA里。 子数组中0的个数和1的个数相同。其实可以让0变成-1,那么问题是变成了子数组中和为0即满足题意。 sum[i]为前缀和。 如果sum[j] - sum[i] = 0,那么区间[i+1,j]构成的子数组即满足题意。 我们将<sum[i],i>的对应关系存
阅读全文
摘要:经典链表判断相交,记住就完事了。 160. 相交链表 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val =
阅读全文
摘要:最暴力的办法是需要枚举每一个起点,然后判断从该起点出发能否满足题意。 从暴力算法出发,如何优化呢? 可以不需要枚举每一个起点吗? 不可以,每一个起点的枚举肯定是少不了的 枚举每一个起点后,判断可能性时可以优化吗 可能很快能想到前缀和,能做到O(1)下判断从该点出发后,到最后一个加油站时剩余油量。但是
阅读全文
摘要:一和零 把总共的 0 和 1 的个数视为背包的容量,每一个字符串视为装进背包的物品。这道题就可以使用 0-1 背包问题的思路完成,这里的目标值是能放进背包的字符串的数量。 动态规划的思路是:物品一个一个尝试,容量一点一点尝试,每个物品分类讨论的标准是:选与不选。 定义状态:尝试题目问啥,就把啥定义成
阅读全文

浙公网安备 33010602011771号