leetcode
文章平均质量分 59
leetcode刷题分享
xiaoAi 123
leetCode刷题+项目开发bug记录+Java技术栈知识分享
展开
-
完全二叉树的节点个数_后序遍历_java
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。1.3 若不是,则递归处理该结点下的子节点,最后返回 (1 + 左子树结点数 + 右子树结点数)1.2 若是,则直接返回该满二叉树的结点数,且不再递归处理该结点下的子节点。给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。2. 一颗满二叉树,若已知其深度为h,则其结点总数为2^h-1。输入:root = [1,2,3,4,5,6]原创 2024-04-03 19:17:55 · 311 阅读 · 0 评论 -
二叉树的最小深度_多种方法求解_java
输入:root = [2,null,3,null,4,null,5,null,6]输入:root = [3,9,20,null,null,15,7]最小深度是从根节点到最近叶子节点的最短路径上的节点数量。先计算出左右子树的最小深度再得出中间结点的最小深度。依次求解中间结点,左节点,右结点的当前深度。树中节点数的范围在 [0, 105] 内。说明:叶子节点是指没有子节点的节点。因为整颗树都被遍历了所以为O(n)因为整颗树都被遍历了所以为O(n)采用前序遍历:中左右。采用后序遍历:左右中。原创 2024-04-03 17:18:30 · 353 阅读 · 0 评论 -
对称二叉树_递归_java
若对子树中的同一层,左子树的左节点等于右子树的右节点,左子树的右节点等于右子树的左节点。输入:root = [1,2,2,null,3,null,3]给你一个二叉树的根节点 root , 检查它是否轴对称。输入:root = [1,2,2,3,4,4,3]判断二叉树是否对称就是判断其左右子树是否对称。树中节点数目在范围 [1, 1000] 内。因为整颗树都被遍历了所以为O(n)原创 2024-04-02 11:04:21 · 340 阅读 · 0 评论 -
前k个高频元素_优先队列_java
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。PriorityQueue类的add方法的时间复杂度为O(logn), 调用了n次所以时间复杂度为O(nlogn)PriorityQueue类的add方法的时间复杂度为O(logn), 调用了n次所以时间复杂度为O(nlogn)输入: nums = [1,1,1,2,2,3], k = 2。k 的取值范围是 [1, 数组中不相同的元素的个数]输入: nums = [1], k = 1。用map记录数组中元素出现的频率。原创 2024-04-02 09:35:06 · 526 阅读 · 0 评论 -
滑动窗口最大值_单调队列_java
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。设r为队列中的元素,则我们需要维护队列中的元素按照r值递增排列,按照nums[r]值递减排列。输入:nums = [1,3,-1,-3,5,3,6,7], k = 3。该题实现线性复杂度的关键在于维护一个单调队列。输入:nums = [1], k = 1。输出:[3,3,5,5,6,7]单调队列中存储着数组元素的下标。返回 滑动窗口中的最大值。空间复杂度:O(n)原创 2024-04-02 00:12:58 · 383 阅读 · 0 评论 -
逆波兰表达式_用栈求解_java
tokens[i] 是一个算符(“+”、“-”、“*” 或 “/”),或是在范围 [-200, 200] 内的一个整数示例。输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,“解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6。解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。输入:tokens = [“4”,“13”,“5”,“/”,“+”]输入:tokens = [“2”,“1”,“+”,“3”,“*”]原创 2024-04-01 22:50:20 · 400 阅读 · 0 评论 -
每日温度_单调栈_java
3.1 若栈内存在元素所指向的元素值小于temperatures[i],就令这些栈内元素出栈,同时记录这些元素 对应的 answer值;输入: temperatures = [73,74,75,71,69,72,76,73]创建一个空栈,该栈中的元素为temperatures数组中元素的下标;输入: temperatures = [30,40,50,60]输出: [1,1,4,2,1,1,0,0]输出: [1,1,1,0]输出: [1,1,0]时间复杂度:O(n)空间复杂度:O(n)原创 2024-03-13 22:25:36 · 544 阅读 · 0 评论 -
使用最小花费爬楼梯_动态规划法_java
由于爬台阶时可选择向上爬两个或者一个,所以对于爬到第i级台阶可以先爬到第(i-1)级台阶再向上爬一级台阶或者先爬到第(i-2)级台阶再向上爬两级台阶。又因为题目所求为最小花费,若以dp[i]代表爬到第i级阶梯所需最小花费,则dp[i] = min { dp[i - 1] + cost[i - 1] , dp[i - 2] + cost[i - 2] }。输入:cost = [1,100,1,1,1,100,1,1,100,1]解释:你将从下标为 1 的台阶开始。解释:你将从下标为 0 的台阶开始。原创 2024-03-11 20:51:47 · 477 阅读 · 0 评论 -
最大子数组和_贪心法与动态规划法_java
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。若当前的连续子序列和大于0,则保留,从而使下一步取的连续子序列为当前的连续子序列 + 下一步处理的元素。该题使用贪心法每步需要进行的选择是:是否保留当前的连续子序列供下一步处理的元素进行连接?输入:nums = [-2,1,-3,4,-1,2,1,-5,4]解释:连续子数组 [4,-1,2,1] 的和最大,为 6。输入:nums = [5,4,-1,7,8]空间复杂度:O(1)空间复杂度:O(n)原创 2024-03-08 18:25:51 · 523 阅读 · 0 评论 -
组合_回溯法_java
第一眼看过去我们就能想到使用蛮力法,采用n重for循环。但细想后会发现n是一个变量我们无法真的将所有的for循环写出来。所以本题的正确解法是采用递归的回溯法。同时根据题目的约束条件进行优化剪枝操作。给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。输入:n = 4, k = 2。输入:n = 1, k = 1。原创 2024-03-06 16:54:30 · 462 阅读 · 0 评论 -
二叉树的层序遍历_队列_java
给你二叉树的根节点 root ,返回其节点值的 层序遍历。(即逐层地,从左到右访问所有节点)。此后从队列中取出第i层二叉树的结点同时将i + 1层的二叉树的结点放入队列中。输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]树中节点数目在范围 [0, 2000] 内。将根结点入栈作为二叉树第1层结点;输入:root = [1]输入:root = []原创 2024-03-03 12:36:05 · 490 阅读 · 0 评论 -
有效括号_栈_java
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。遍历字符串,若为左括号则入栈, 若为右括号则从栈中取左括号与之匹配。每个右括号都有一个对应的相同类型的左括号。s 仅由括号 ‘()[]{}’ 组成。左括号必须用相同类型的右括号闭合。输入:s = “()[]{}”左括号必须以正确的顺序闭合。输入:s = “()”输入:s = “(]”原创 2024-03-03 11:31:13 · 436 阅读 · 0 评论 -
用栈实现队列_java
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。请你仅使用两个栈实现先入先出队列。用两个栈一个输入栈一个输出栈来模拟队列,将元素加入队列时使用输入栈,将元素取出队列时使用输出栈。假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)int pop() 从队列的开头移除并返回元素。原创 2024-03-01 09:28:49 · 438 阅读 · 0 评论 -
四数之和_双指针_java
四数之和的双指针解法是在三数之和的双指针解法的基础上再加一重循环。有对三数之和的双指针解法不清楚的小伙伴可参考本人的。请你找出并返回满足下述全部条件且。原创 2024-02-28 09:49:30 · 419 阅读 · 0 评论 -
三数之和_双指针_java
考虑数组[-2, 0, 0, 2, 2],当i = 0, left = 1, right = 4时取得符合条件的三元组【-2,0,2】。若对a的去重判断为nums[i] == nums[i + 1],那么由于满足条件的a元素不等于nums[i + 1]则求得的三元组中b元素一定不等于a元素。为什么对a的去重判断应为nums[i] == nums[i - 1]而不是nums[i] == nums[i + 1]?输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]原创 2024-02-26 11:05:29 · 423 阅读 · 1 评论 -
赎金信_哈希法_java
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。输入:ransomNote = “aa”, magazine = “aab”输入:ransomNote = “aa”, magazine = “ab”magazine 中的每个字符只能在 ransomNote 中使用一次。输入:ransomNote = “a”, magazine = “b”nsomNote 能不能由 magazine 里面的字符构成。原创 2024-02-22 09:54:55 · 453 阅读 · 1 评论 -
四数之和II_HashMap_java
输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]原创 2024-02-20 09:59:05 · 429 阅读 · 0 评论 -
两数之和_hashmap_java
遍历数组nums对每个nums[i]查找数组中是否存在nums[j] = target - nums[i]。若存在则返回[i, j]。为降低本题的时间复杂度可用map来判断数组中是否存在nums[j] = target - nums[i]。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。输入:nums = [2,7,11,15], target = 9。输入:nums = [3,2,4], target = 6。输入:nums = [3,3], target = 6。原创 2024-02-19 09:39:22 · 492 阅读 · 1 评论 -
两个数组的交集II_多种方法_java
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输入:nums1 = [1,2,2,1], nums2 = [2,2]设nums1长度为n, nums2长度为m。设nums1长度为n, nums2长度为m。原创 2024-02-18 10:25:52 · 466 阅读 · 1 评论 -
两个数组的交集_HashSet_java
给定两个数组 nums1 和 nums2 ,返回 它们的交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输入:nums1 = [1,2,2,1], nums2 = [2,2]解释:[4,9] 也是可通过的。时间复杂度: O(n)空间复杂度:O(n)原创 2024-02-16 15:04:36 · 480 阅读 · 1 评论 -
字母异位词分组_多种方法_java
输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]运用流及收集器的分类聚合功能, 分类聚合标准为由字符统计数组转换成的字符串。 由于对数组中每个字符串中的字符进行了处理复杂度为O(nk) 设数组中字符串个数为n,字符串最大长度为k。 设数组中字符串个数为n,字符串最大长度为k。 设数组中字符串个数为n,字符串最大长度为k。输出: [[“”]]原创 2024-02-15 11:31:27 · 485 阅读 · 1 评论 -
设计链表_双向链表_java
void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。val 是当前节点的值,next 是指向下一个节点的指针/引用。void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。int get(int index) 获取链表中下标为 index 的节点的值。void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。原创 2024-02-06 11:50:26 · 1934 阅读 · 1 评论 -
两两交换链表中的节点_单链表_java
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。链表中节点的数目在范围 [0, 100] 内。输入:head = [1,2,3,4]输入:head = [1]输出:[2,1,4,3]输入:head = []原创 2024-02-07 10:00:16 · 331 阅读 · 1 评论 -
移动零_双指针法_java
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]输入: nums = [0]时间复杂度: O(n)空间复杂度: O(1)原创 2024-02-02 17:53:39 · 345 阅读 · 0 评论 -
长度最小的子数组_滑动窗口_java
找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。输入:target = 11, nums = [1,1,1,1,1,1,1,1]虽然该解法使用了两层循环,但实际上每个元素都是进入一次滑动窗口再出一次滑动窗口。输入:target = 7, nums = [2,3,1,2,4,3]输入:target = 4, nums = [1,4,4]解释:子数组 [4,3] 是该条件下的长度最小的子数组。原创 2024-02-04 15:54:53 · 458 阅读 · 1 评论 -
螺旋矩阵_java
每次按照顺时针螺旋顺序处理矩阵的一条边时通过矩阵当前的上下左右边界定位要处理的元素位置。当左边界大于右边界或者上边界大于下边界时处理结束。给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]输出:[1,2,3,6,9,8,7,4,5]原创 2024-02-05 11:07:41 · 649 阅读 · 1 评论 -
删除链表中倒数第n个结点_双指针法_java
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。你能尝试使用一趟扫描实现吗?输入:head = [1,2,3,4,5], n = 2。输入:head = [1,2], n = 1。输入:head = [1], n = 1。链表中结点的数目为 sz。输出:[1,2,3,5]原创 2024-02-12 09:51:51 · 445 阅读 · 1 评论 -
链表相交_双指针法_java
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null。原创 2024-02-13 09:38:34 · 382 阅读 · 0 评论 -
有效的完全平方数_二分法_java
给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。不能使用任何内置的库函数,如 sqrt 。原创 2024-01-08 17:05:56 · 394 阅读 · 0 评论 -
搜索插入位置_二分查找_java
此时end = begin - 1。而 当程序最后一次执行while循环时有两种情况:情况一、 nums[mid] < target, 则程序执行left = mid + 1,则退出循环后left = mid + 1,right = mid。情况二、nums[mid] > target, 则程序执行right = mid - 1,则退出循环后right = mid - 1,left = mid。而right + 1 = (mid - 1) + 1,所以其返回值也为(right + 1)。原创 2024-01-07 22:30:36 · 371 阅读 · 1 评论