随笔分类 - 算法
记录自己不大熟的LeetCode题目
摘要:题目链接 127. 单词接龙 思路 参考宫水三叶大佬的题解 本题最朴素的解法是运用 BFS 求解,从 beginWord 出发,枚举所有替换一个字符的方案,如果方案存在于 wordList 中,则加入队列中,这样队列中就存在所有替换次数为 1 的单词。然后从队列中取出元素,继续这个过程,直到遇到 e
阅读全文
摘要:题目链接 130. 被围绕的区域 思路 BFS 模板的简单变换。 分析题目可以知道,如果一片 O 想要存活,则这一片 O 必然与边界接触。我们可以遍历四个边界,找到所有与边界接触的 O,则剩下的就是需要变为 X 的 O。 代码 class Solution { void bfs(int i, int
阅读全文
摘要:题目链接 133. 克隆图 思路 通过 HashMap 存储原结点与克隆结点的对应关系,这样在 BFS 遍历图的过程中,能够很方便找到该结点对应的克隆结点,并修改克隆结点的邻接表。 代码 class Solution { public Node cloneGraph(Node node) { if(
阅读全文
摘要:题目链接 200. 岛屿数量 思路 BFS在图上的简单应用 代码 class Solution { private void bfs(int i, int j, boolean[][] visit, char[][] grid) { int[] dx = new int[]{1, 0, -1, 0}
阅读全文
摘要:题目链接 297. 二叉树的序列化与反序列化 思路 使用BFS的方法进行序列化及反序列化 序列化 运用BFS遍历树的所有结点,不论是否为null都放进队列中。 如果结点不为 null,则把结点数据转为字符串放入结果字符串中。 如果结点为 null,则把 "X" 放入结果字符串中。 所有结点都以 ",
阅读全文
摘要:题目链接 103. 二叉树的锯齿形层序遍历 思路1 额外加一个栈来使得访问节点的顺序是逆序的 代码1 class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { if(root == null){ ret
阅读全文
摘要:题目链接 102. 二叉树的层序遍历 思路 树的层次遍历模板题,需要使用一个变量来记录每一层的结点个数 代码 class Solution { public List<List<Integer>> levelOrder(TreeNode root) { if(root == null){ retur
阅读全文
摘要:题目链接 34. 在排序数组中查找元素的第一个和最后一个位置 思路 转自:林小鹿的题解 两套二分查找模板,分别用来查找左边界和右边界 int bsearch_1(int l, int r) { while (l < r) { int mid = (l + r)/2; if (check(mid))
阅读全文
摘要:题目链接 295. 数据流的中位数 思路 维护两个优先队列,分别装载排序后数据流左边的数和数据流右边的数,其中 left 为大顶堆,right 为小顶堆。如果元素个数是奇数,则把中位数放到 left 中。 代码 class MedianFinder { PriorityQueue<Integer>
阅读全文
摘要:题目链接 692. 前K个高频单词 思路 还是与前k大问题一样,只不过需要注意一下字典序的问题。 代码 class Solution{ public List<String> topKFrequent(String[] words, int k){ HashMap<String, Integer>
阅读全文
摘要:题目链接 23. 合并K个升序链表 思路 把全部结点放入优先队列中,然后再依次组成新链表 代码 class Solution { public ListNode mergeKLists(ListNode[] lists) { PriorityQueue<Integer> listNodePriori
阅读全文
摘要:题目链接 347. 前 K 个高频元素 思路 前k大模板题 代码 class Solution{ public int[] topKFrequent(int[] nums, int k){ PriorityQueue<Map.Entry<Integer, Integer>> priorityQueu
阅读全文
摘要:题目链接 973. 最接近原点的 K 个点 思路 使用优先队列处理前k大问题 代码 class Solution { class Node{ int x; int y; double distance; } public int[][] kClosest(int[][] points, int k)
阅读全文
摘要:题目链接 299. 猜数字游戏 思路 建立两个哈希表分别存储 secret 和 guess 中不是bulls的数字出现次数。 代码 class Solution{ public String getHint(String secret, String guess){ int[] secretAlph
阅读全文
摘要:题目链接 350. 两个数组的交集 II 思路 建立两个哈希表分别统计 nums1 和 nums2 中每个数字出现的个数,然后同时遍历两个哈希表,对两个对位元素取其最小值 count,将 count 数量的数字放入结果数组中。 代码 class Solution { public int[] int
阅读全文
摘要:题目链接 49. 字母异位词分组 思路 如果一对字符串是字母异位词,那么他们经过排序之后,应该是相等的。 利用这一特点,我们通过哈希表建立排序后字符串到原字符串列表的映射,不断把 strs 中的字符串加入到合适的链表中。 最后遍历哈希表,可以得到最终结果。 代码 class Solution{ pu
阅读全文
摘要:题目链接 380. O(1) 时间插入、删除和获取随机元素 思路 下面引用宫水三叶大佬的题解 insert 操作:使用哈希表判断 val 是否存在,存在的话返回 false,否则将其添加到 nums,更新 idx,同时更新哈希表; remove 操作:使用哈希表判断 val 是否存在,不存在的话返回
阅读全文
摘要:题目链接 73. 矩阵置零 思路1 遍历矩阵,分别使用集合 row 和 column 记录值为0的行和列。最后将 row 和 column所记录的行和列置为零。 空间复杂度: $O(m + n)$ 代码1 class Solution { public void setZeroes(int[][]
阅读全文
摘要:题目链接 128. 最长连续序列 思路 题目要求找连续序列,且时间复杂度读要求 O(n),可以使用集合进行实现。 代码 class Solution{ public int longestConsecutive(int[] nums){ Set<Integer> numSet = new HashS
阅读全文
摘要:题目链接 146. LRU 缓存 思路 使用Java中的 LinkedHashMap 类型,其数据结构示意图如下图所示。 因为该数据结构中最近添加的元素都在链表尾部,所以要让某个元素变为最近使用的状态,需要将它先删除,然后再插入。表头存储的就是最少使用的元素,使用 this.cache.keySet
阅读全文