
leetcode算法
永远在摸鱼的桃
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode 305. 岛屿数量 II (并查集)
LeetCode 305. 岛屿数量 II (并查集)原创 2022-06-06 10:22:46 · 228 阅读 · 0 评论 -
200. 岛屿数量 (递归 / 并查集)
并查集 岛屿数量原创 2022-06-06 09:12:48 · 245 阅读 · 0 评论 -
LeetCode 502. IPO (贪心算法)
IPO 贪心算法原创 2022-06-03 21:17:47 · 416 阅读 · 0 评论 -
LeetCode 450. 删除二叉搜索树中的节点 (递归)
删除二叉搜索树中的节点原创 2022-06-02 11:40:35 · 183 阅读 · 0 评论 -
LeetCode 543. 二叉树的直径 (二叉树递归套路)
思路代码实现public class Code06_MaxDistance { public static class Node { public int value; public Node left; public Node right; public Node(int data) { this.value = data; } } public static cla.原创 2022-05-29 13:40:21 · 1238 阅读 · 0 评论 -
LeetCode 1021. 删除最外层的括号 (栈 / 字符串)
思路这道题可以用栈来找出所有原语分解,然后对每个分解后的去除最左边和最右边的括号最后连在一起即可,但是这种复杂度较高。由于题中说了S一定是合法的,我们就可以用统计左括号的个数的方法直接过滤掉每个原语的最外层括号。代码实现// 时间复杂度较高class Solution { public String removeOuterParentheses(String s) { Stack<Character> stack = new Stack<>().原创 2022-05-28 09:11:13 · 233 阅读 · 0 评论 -
LeetCode 431. 将N叉树编码为二叉树 (深度优先遍历)
思路代码实现(java)/*// Definition for a Node.class Node { public int val; public List<Node> children; public Node() {} public Node(int _val) { val = _val; } public Node(int _val, List<Node> _children) { .原创 2022-05-26 23:28:44 · 198 阅读 · 0 评论 -
LeetCode 124. 二叉树中的最大路径和 (递归)
思路代码实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode r.原创 2022-05-26 00:11:51 · 278 阅读 · 0 评论 -
链表相关面试题
判断链表是否为回文结构给定一个单链表的头节点head,请判断该链表是否为回文结构思路1. 额外空间占用为O(n)的,使用额外空间2. 额外空间占用为O(1)的,不使用额外空间代码实现将链表按n划分成左边<n、中间==n、右边>n给定一个单链表的头节点head,给定一个整数n,将链表按n划分成左边<n、中间==n、右边>n思路1. 额外空间占用为O(n)的,使用额外空间2. 额外空间占用为O(1)的,不使用额外空间代码实现复制一个特殊结构的单链表一原创 2022-05-25 19:47:10 · 278 阅读 · 0 评论 -
LeetCode 965. 单值二叉树 (递归)
思路如果根节点为null,返回true。如果根节点值和左右子树值相同并且左右子树都是单值树返回true代码实现/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } .原创 2022-05-24 09:05:18 · 117 阅读 · 0 评论 -
LeetCode 464. 我能赢吗 (递归 / 位运算 / 博弈论)
思路首先判断特例:如果最大能选择的数字maxChoosableInteger比期望的总数desiredTotal要大,先手稳赢,返回True如果能选择的所有数字总和比期望的总数desiredTotal要小,一定到达不了desiredTotal,先手稳输,返回False用二进制位来标记某个数是否已被选择,比如01表示1已被选择,10表示2已被选择,11表示1和2都被选择,100表示3被选择,以此类推,1 << i 表示 i + 1已被选择n个数共有2n种被选择与否的状态.原创 2022-05-22 10:44:09 · 475 阅读 · 0 评论 -
计数排序 + 基数排序
计数排序统计给定一个集合中,每个数字出现的次数,然后根据次数,依次将对应数组按顺序放回但是计数排序有局限性,只能一次统计已知一定范围内的元素。如下列示例代码中,找到数组元素最大值,然后创建以最大值为大小的数组,作为桶进行技术,会造成空间浪费,也有一定局限性。代码实现 // only for 0~200 value public static void countSort(int[] arr) { if (arr == null || arr.length < 2) { retur原创 2022-05-20 13:12:48 · 179 阅读 · 0 评论 -
LeetCode 436. 寻找右区间 (排序 / 二分 / 哈希表)
思路TreeMap根据题目描述,注意几个地方,每个start[i]都不同,而且要求start[j]>=end[i],很容易联想到使用带排序的哈希结构,也就是TreeMap,具体实现为:第一次遍历 intervals,完成TreeMap的构造,key为左端点,value为index位置;第二次遍历 intervals,对每个interval的右端点取ceiling,如果不存在,即为-1,填充在结果集中;排序 + 二分为了方便,我们称 intervals 为 its。对于每个 its[.原创 2022-05-20 11:06:35 · 215 阅读 · 0 评论 -
前缀树讲解 -- LeetCode 208. 实现 Trie (前缀树)
思路每个节点都从root根节点开始遍历,如果经过某个节点,就将这个节点的pass++,如果一个字符串到达了末尾,就将这个节点的end++;循环遍历每个节点,就会创建出一颗前缀树代码实现(java)前缀树:public class TrieTree { public static class Node { public int pass; public int end; public Node[] nexts; public.原创 2022-05-19 22:49:57 · 296 阅读 · 0 评论 -
LeetCode 453. 最小操作次数使数组元素相等 & 462. 最少移动次数使数组元素相等 II (排序 | 数学)
思路453. 最小操作次数使数组元素相等根据题意,每次操作将会使 n - 1 个元素增加 1 。由于你执行了 k 次,所以一共会使 sum 增加 k * (n - 1) 。即操作结束后数组的和为 sum + k * (n - 1) 。贪心部分:在整个流程的每次操作中,最小的那个值都会增加 1 。(贪心的证明在下个板块,建议最后看)由贪心可知,经过k 步后, min 变为了 min + k ,也意味着此时数组的每一项都变为了 min + k ,所以操作结束后数组的和为 n * (min + k)...原创 2022-05-19 09:45:51 · 291 阅读 · 0 评论 -
LeetCode 668. 乘法表中第k小的数 (矩阵二分查找)
思路对一个数值范围在[1,m * n]的矩阵,每一行从左到右是递增的,每一列从上到下是递增的。所以我们可以定义左右指针指向矩阵的初始和末尾,同时对每一次计算出的mid,累加矩阵中每一行,小于mid的元素个数cnt。如果最终cnt >= k,说明小于二分出的中间节点mid的元素个数比题目要求的k还要多,需要调整右指针r的位置,使其下一轮在[l, mid]中搜索;反之说明小于mid的元素个数比k要少,达不到k,需要调整左指针l的位置,使其下一轮在[mid + 1, r]中搜索。重点说明的是.原创 2022-05-18 09:45:58 · 358 阅读 · 0 评论 -
LeetCode 面试题 04.06. 后继者
思路一、暴力(中序)使用二叉搜索树中序遍历有序的特性,对二叉树进行中序遍历存入集合当中,然后在末尾加入一个null(末尾节点的下一个为null)得到题目中给定节点在集合中的下一位即可二、BST 特性 + 递归利用 BST 的特性,我们可以根据当前节点 root 与 p 的值大小关系来确定搜索方向:若有 root.val <= p.val : 根据 BST 特性可知当前节点 root 及其左子树子节点均满足 值小于等于 p.val ,因此不可能是 p 点的后继,抛弃到左子树,我们直接到.原创 2022-05-16 10:57:16 · 236 阅读 · 0 评论 -
最大线段重合问题 (堆实现) ---- LeetCode 452. 用最少数量的箭引爆气球(贪心算法)
给定很多线段,每个线段都有两个数组[start,end],表示线段开始位置和结束位置,左右都是闭区间规定:线段开始和结束位置一定是整数线段重合区域的长度必须 >= 1返回线段最多重合区域中,包含了几条线段思路使用小根堆,排序代码实现public int MaximumSegmentCoincide() { if (points.length == 0) return 0; Arrays.sort(points, (x, y) -> Integer.compare(x[原创 2022-05-14 21:41:59 · 1174 阅读 · 0 评论 -
堆排序讲解 + 相关习题 + 加强堆
堆结构堆结构就是用数组实现的完全二叉树结构,也叫做优先级队列结构,堆排序是利用堆这种数据结构而设计的一种排序算法, 堆排序是一种选择排序, 它的最坏, 最好平均时间复杂度均为 O(nlogn), 它也是不稳定排序。堆是具有以下性质的完全二叉树: 每个结点的值都大于或等于其左右孩子结点的值, 称为大顶堆(注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系,)每个结点的值都小于或等于其左右孩子结点的值, 称为小顶堆对于任意一颗完全二叉树,它的任意的父子节点都有以下规律:1. 父节点的下标(Fin原创 2022-05-13 11:56:19 · 873 阅读 · 0 评论 -
LeetCode 面试题 01.05. 一次编辑 (字符串 / 双指针)
思路首先判断两个字符串长度,因为只能编辑一次,所以两字符串的差值只能在 -1 0 1 这三个之中;得到差值之后,定义与两个字符串对应的双指针Findex、Sindex和变化次数count,进入字符串遍历的循环当中;如果first长度大于second(或者second长度大于first),则发现两字符某字符不同时,对应的Findex、Sindex增加(插入、删除的逻辑,一次改变),count++;然后下一次循环如果长度相等,则字符不同时,就进行替换逻辑,count++;过程中如果发现count .原创 2022-05-13 09:01:25 · 895 阅读 · 0 评论 -
快速排序讲解+相关习题
1. 普通快速排序( O(N2) )思路规则最坏情况(复杂度):[1,2,3,4,5,6,7], 这样的有序数组,每一次选择最后一个数作为比较值,需要比较所有其他N - 1个数,然后进入下一次递归,比较剩下的有序数组。比较的次数就是 n + n-1 + n-2 … + 2 + 1 等差数列,即为 O(N2)代码实现(java) public static void swap(int[] arr, int L, int R) { int temp = arr[L];原创 2022-05-12 13:50:36 · 2142 阅读 · 0 评论 -
LeetCode 327. 区间和的个数 (前缀和 / 归并排序 / hard难度)
思路因为归并后原顺序不变,并且因为归并过程中左右都是保持有序的,所以区间会不断推进,不会有重复的情况,时间复杂度也是O(n)的。代码实现(java)//leetcode submit region begin(Prohibit modification and deletion)class Solution { public static int countRangeSum(int[] nums, int lower, int upper) { if (nums == .原创 2022-05-12 10:37:58 · 350 阅读 · 0 评论 -
LeetCode 449. 序列化和反序列化二叉搜索树 (BFS \ 二叉搜索树)
类似题目:297. 二叉树的序列化与反序列化思路一、BFS层序遍历:思路和297题一样二、利用二叉搜索树的性质代码实现(java)/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public cl.原创 2022-05-11 11:10:23 · 160 阅读 · 0 评论 -
LeetCode 297. 二叉树的序列化与反序列化 (层序遍历 \ 字符串)
思路序列化:利用BFS层序遍历二叉树,节点与节点之间用 , 隔开;如果遇到空节点,则使用字母 X 代替,最终以字符串返回反序列化:将序列化串,根据 , 分隔并保存在一个队列中;同时创建一个树节点的队列用来遍历到每层节点;遍历过程中,每次取出根节点和它可能的左右节点,然后判断这两个左右节点是否为 X ,如果是,则跳过说明为空节点;如果不是则加入其对应左右节点处,并加入队列中。代码实现(java)/** * Definition for a binary tree node. * publi.原创 2022-05-11 10:20:56 · 361 阅读 · 0 评论 -
LeetCode 942. 增减字符串匹配(双指针 + 贪心算法)
思路用两个指针保存当前剩余的最大值和最小值根据题意,创建res结果数组;然后遍历s字符串中的每一个字符,进行判断如果当前 i 位置字符为 ‘I’,则将最小值放入res的 i 位置,最小值加一如果当前 i 位置字符为 ‘D’,则将最大值放入res的 i 位置,最大值减一遍历结束后,将当前最大值的数,放入结果数组的最后一位返回,就是最终的结果代码实现(java)class Solution { public int[] diStringMatch(String s) { .原创 2022-05-09 09:12:39 · 388 阅读 · 0 评论 -
归并排序讲解+相关面试题
代码实现(java)包含递归和非递归public class MergeSort { public static void main(String[] args) { int[] arr = new int[] {4,1,2,5,7,2,1,7,9,3}; for (int i : arr) { System.out.print(i + " "); } mergeSort2(arr); Sys原创 2022-05-08 21:42:59 · 642 阅读 · 0 评论 -
LeetCode 442. 数组中重复的数据
思路题目中给出的信息,n == nums.length;1 <= nums[i] <= n;nums 中的每个元素出现 一次 或 两次;所以我们可以这么做:每次遍历到数组中的一个值 num,就将数组中nums[num - 1] 的值乘以 -1;因为每个元素出现一次 或 两次,如果不重复,那么 nums[num - 1] 的值最多只会被乘以一次 -1;而如果有重复的值,那么遍历到这个重复值的时候,判断nums[num - 1]的值是否为负数,如果为负数,说明已经有过这个值,即出现了重.原创 2022-05-08 11:37:41 · 278 阅读 · 0 评论 -
LeetCode 433. 最小基因变化 (BFS)
思路BFS模板// 计算从起点 start 到终点 target 的最近距离int BFS(Node start, Node target) { Queue<Node> q; // 核⼼数据结构 Set<Node> visited; // 避免⾛回头路 q.offer(start); // 将起点加⼊队列 visited.add(start); int step = 0; // 记录扩散的步数 while (q not empt.原创 2022-05-07 11:08:41 · 221 阅读 · 0 评论 -
LeetCode 713. 乘积小于K的子数组 (滑动窗口)
思路因为每一次都是right右移的过程,也就是范围扩大的过程,而每次都会累加子数组的个数;所以当次循环下,只需要关注的是这次left ~ right范围内的子数组个数即可;因为下次循环就会有新元素加入,right就会扩大,而之前的子数组也已经在累加之前就已经算进去了以此类推,累加即可代码实现(java)class Solution { public int numSubarrayProductLessThanK(int[] nums, int k) { int le.原创 2022-05-05 11:28:30 · 390 阅读 · 0 评论 -
LeetCode 98. 验证二叉搜索树 (递归)
思路利用二叉搜索树的特性,左子树均小于根节点,右子树均大于根节点;所以我们利用一个函数,传入一个节点的左右子树,以及它所对应的最大值和最小值;对于左子树,最小值为空,最大值就是当前根节点的值对于右子树,最大值为空,最小值就是当前根节点的值根据这个规律,依次递归的查找每个节点的左右子树,是否在其对应的范围之内,如果最后到达叶子结点都符合,说明是二叉搜索树,返回true;只要有一个不符合,就返回false代码实现(java)/** * Definition for a binary tre.原创 2022-05-04 16:37:18 · 615 阅读 · 0 评论 -
LeetCode 235. 二叉搜索树的最近公共祖先 (递归)
思路利用二叉搜索树的性质,左子树中的值都小于根节点,右子树中的值都大于根节点;根据题意要找到公共父节点,也就是说,p和q在一个节点的两端,即一个大于根节点,一个小于根节点所以可以使用递归的方式,如果p和q同时小于或者大于根节点,就去他的对应的左子树(同时小于都在左子树中)和右子树(同时大于都在右子树中)中寻找。直到找到不同时大于或者小于的根节点,就是他们的最近公共父节点(第一次遇到这样的节点,一定是最近的)代码实现/** * Definition for a binary tree no.原创 2022-05-04 16:12:02 · 338 阅读 · 0 评论 -
LeetCode 110. 平衡二叉树
思路递归首先设置一个静态内部类Info用来存储各个节点代表子树的平衡性;节点中保存的信息有当前节点下的左右子树是否平衡isBalanced,以及当前节点的最大高度height然后进入方法process,该方法的作用就是去递归的判断各个节点的平衡情况,然后最终返回给主函数判断根节点root的平衡情况如果root为空,证明到达了叶子结点,平衡高度为0返回如果root不为空,则向下,递归的调用process方法,去判断当前节点的左右子树是否平衡,以及计算高度,然后返回高度的获取规则:左右子树中较.原创 2022-05-04 15:40:22 · 470 阅读 · 0 评论 -
LeetCode 1823. 找出游戏的获胜者 (约瑟夫环)
思路下图所演示的是1 ~ n的情况,下标0 ~ n-1同样适用李永乐约瑟夫环讲解代码实现(java)class Solution { public int findTheWinner(int n, int k) { int ans = 0; for(int i = 2; i <= n; i++) { ans = (ans + k) % i; } return ans + 1; }}.原创 2022-05-04 11:34:44 · 1036 阅读 · 0 评论 -
LeetCode 23. 合并K个升序链表 (小根堆 \ 链表)
思路利用java中提供的优先级队列(默认的小根堆)可以解决此问题首先将所有链表头加入优先级队列然后每次遍历取出小根堆中的最上链表(元素值最小)然后将该节点加入结果链表中将取出的这个链表后移,如果不为空则继续加入堆中;如果为空(该链表全为空)则直接跳出循环遍历其他链表将结果链表也后移,为下一个节点的加入做准备最终返回结果链表真正的头结点即可代码实现(java)/** * Definition for singly-linked list. * public class ListNo.原创 2022-05-03 09:39:40 · 279 阅读 · 0 评论 -
LeetCode每日一题 937. 重新排列日志文件 (字符串 \ 数组 \ 比较器)
思路首先遍历每一个数组,然后判断数组中空格分隔的第二个元素是否是数字;如果是数字则加入数字集合;如果是单词,则加入单词集合然后使用集合的排序,自定义比较器;根据题意,如果标识符后面的元素都相同,则使用标识符的字典序比较两字符串;否则后面元素不同,直接根据后面的元素的字典序比较即可代码实现(java)class Solution { public String[] reorderLogFiles(String[] logs) { List<String> w.原创 2022-05-03 09:21:31 · 225 阅读 · 0 评论 -
LeetCode 面试题 02.05. 链表求和
思路首先获取链表长度,然后用 l 和 s 分别存储长链表 和 短链表;遍历过程分为三个阶段(最终结果就存储在较长的 l 中)l不为空,s也不为空:这时先遍历短链表s,每次计算 l.val + s.val + 进位 的值,然后对10取余作为当前位置的值,除10作为进位,然后l、s向前遍历l不为空,s为空:这时接着遍历长链表l,因为s已经为空,所以每次只计算 l.val + 进位 的值,然后对10取余作为当前位置的值,除10作为进位,然后l向前遍历l为空,s也为空:这时只需判断进位是否为0,如果为0.原创 2022-04-30 23:37:02 · 968 阅读 · 0 评论 -
LeetCode 25. K 个一组翻转链表(Hard)
思路首先定义两个函数分别是,从start位置开始,返回之后的第k个节点 和 从start开始,到end反转,然后将反转后的尾节点连接到之后的链表然后在主函数中,进行具体的操作逻辑;将函数k个一组进行反转,然后尾节点连接到之后的节点,用一个lastEnd节点记录这次的尾节点,然后循环往复,每次将lastEnd连接到下一个反转后链表的头部,保持反转后相连画图解释:代码实现(java)/** * Definition for singly-linked list. * public clas.原创 2022-04-30 20:34:44 · 506 阅读 · 0 评论 -
与LeetCode 162类似的,对无序数组二分法求局部最小
题目要求与162题相反,求低谷值同样的,因为题目给出了边界值(左右边界看做无穷大),所以一定会出现低谷值arr[0] < arr[1] :则低谷值就是 arr[0];arr[N - 1] < arr[N - 2] :则低谷值就是最后一个元素;arr[i - 1] > arr[i] < arr[i + 1] :则低谷值为 arr[i]采用二分的方式// 局部最小值, 任意一个谷底值位置public static int localMin(int[] nums) {原创 2022-04-30 11:28:24 · 342 阅读 · 0 评论 -
LeetCode 427. 建立四叉树 (递归dfs \ 矩阵)
思路根据0,1矩阵,构建四叉树,根据题意就是要判断,当前矩阵中的值是否全部相同若矩阵内值相同,也就是只有0或1,则作为叶子节点,叶子结点的值就是这个矩阵的值若矩阵内值不相同,也就是有0也有1,则该矩阵被划分为4个部分,继续判断子矩阵,所以可以递归进行。根据分析,定义深度优先遍历函数:dfs(grid, r0, c0, r1, c1): 构造以[r0,c0]为左上,[r1,c1]为右下的矩阵所表示的四叉树的根节点。每个矩阵都可以划分为这样的四个,可以使用递归深搜的方式,对矩阵进行判断。原创 2022-04-29 21:29:08 · 523 阅读 · 0 评论 -
算法基础 -- 位图、前缀和、二分、比较器
获取一个数的二进制数标识public void print(int num) { for (int i = 31; i >= 0; i--) { System.out.println((num & (1 << i)) == 0 ? "0" :"1"); } System.out.println();}32位二进制无符号数的范围 0 ~ 23232位二进制有符号数的范围 -231 ~ 231-1 解释为什么是这个范围,因为正数包含了原创 2022-04-28 21:43:03 · 822 阅读 · 0 评论