LeetCode刷题笔记
海边画家
这个作者很懒,什么都没留下…
展开
-
LeetCode刷题笔记day30-n皇后问题求解
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。输入:n = 4输出:[[".Q…","…Q",“Q…”,"…Q."],["…Q.",“Q…”,"…Q",".Q…"]]如下:来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/原创 2022-03-25 21:41:50 · 85 阅读 · 0 评论 -
LeetCode刷题笔记day29-分割回文串
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符示例输入:s = “aab”输出:[[“a”,“a”,“b”],[“aa”,“b”]]此图来自代码随想录。补充一点在截取ab后加上 a|ab| 可能更容易理解。class Solution { LinkedList<List<String>>lists = new LinkedList<>(); Lin原创 2022-03-05 16:31:13 · 109 阅读 · 0 评论 -
LeetCode刷题笔记day28-组合
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。示例 1:输入:n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/combinations著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。在做回溯问题的时候,要有抽象树的形状,比如1234四个原创 2022-02-24 21:14:58 · 83 阅读 · 0 评论 -
LeetCode刷题笔记day27-把二叉搜索树转换为累加树
把二叉搜索树转换为累加树给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。注意:本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-.原创 2022-02-18 13:41:49 · 98 阅读 · 0 评论 -
LeetCode刷题笔记day26-搜索二叉树的节点删除-非递归做法
删除二叉搜索树中的节点给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。LeetCode:https://leetcode-cn.com/problems/delete-node-in-a-bst/class Solution { public TreeNode deleteNode(Tr.原创 2022-01-13 16:36:18 · 170 阅读 · 0 评论 -
LeetCode刷题笔记day24-二叉树的公共祖先问题
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。示例 2:输入:root = [3,5,1,6,2,0,8,null,nu原创 2022-01-09 22:24:51 · 128 阅读 · 0 评论 -
LeetCode刷题笔记day23-如何判断一棵树是否为平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。递归步骤:①、首先自定义函数height获取树的高度②、然后通过递归先获取左子树的高度和右子树的高度③、判断左子树是否为平衡树,右子树是否为平衡树,然后两者的高度差是否小于等于1,若是则返回true否则返回false代码如下:class Solution { public boolean isBalanced(TreeNode root) {原创 2021-09-23 17:21:00 · 92 阅读 · 0 评论 -
LeetCode刷题笔记day22-完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例 1:输入:root = [1,2,3,4,5,6]输出:6来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/count-complete-tree-nodes递归实现:①、确原创 2021-09-11 12:34:50 · 180 阅读 · 0 评论 -
LeetCode刷题笔记day21-二叉树的最小深度(递归和非递归实现)
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例 1:输入:root = [3,9,20,null,null,15,7]输出:2示例 2:输入:root = [2,null,3,null,4,null,5,null,6]输出:5链接:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree递归:①、确定递归参数为根节点②、结束条件,当根节点原创 2021-09-08 00:27:26 · 123 阅读 · 0 评论 -
LeetCode刷题笔记day20-求二叉树深度(递归和非递归实现)
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回它的最大深度 3 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree递归实现:①、结束条件:当根节点为空时,返回深度为0②、参数:树的根节点原创 2021-09-06 22:37:56 · 130 阅读 · 0 评论 -
LeetCode刷题笔记day19-对称二叉树(递归和迭代实现)
给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ 2 2/ \ / 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:1/ 2 2\ 3 3链接:https://leetcode-cn.com/problems/symmetric-tree递归三要素:①、确定结束条件②、确定递归参数③、确定单次逻辑class Solution { public boo原创 2021-09-01 13:28:28 · 99 阅读 · 0 评论 -
LeetCode刷题笔记day18-翻转二叉树(递归和非递归实现)
翻转一棵二叉树。示例:输入:4/ 2 7/ \ / 1 3 6 9输出:4/ 7 2/ \ / 9 6 3 1链接:https://leetcode-cn.com/problems/invert-binary-tree递归算法:①、确定递归参数②、确定退出条件③、确定单层逻辑首先,当root为空时直接返回,invertTree函数的作用相当于将二叉树绕中心轴旋转180°,故先将左子树翻转180°,再将右子树翻转180°,最原创 2021-08-31 14:34:05 · 187 阅读 · 0 评论 -
LeetCode刷题笔记day17-层次遍历
题目描述102. 二叉树的层序遍历给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层序遍历结果:[[3],[9,20],[15,7]]解决方案:层次遍历又称广度优先遍历,利用队列先进先出的特点,首先让根节点进队,然后进入循环,判断队列是否为空,同时统计队列此时的长度,将此时队列中的元素全部出队,同时每出队一个元素,则把该元素的左右节原创 2021-08-30 14:07:53 · 100 阅读 · 0 评论 -
LeetCode刷题笔记day16-中序遍历(递归和非递归实现)
递归方式这里不做详细的介绍递归代码:class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new LinkedList<Integer>(); treaversal(root,list); return list; } public void treaversal(原创 2021-08-28 17:53:03 · 98 阅读 · 0 评论 -
LeetCode刷题笔记day16-先序遍历(递归和非递归实现)
先序遍历二叉树定义节点class TreeNode{ int val; TreeNode left; TreeNode right; public TreeNode(){} public TreeNode(int val){ this.val = val; } public TreeNode(int val,TreeNode left,TreeNode ri原创 2021-08-27 20:26:36 · 112 阅读 · 0 评论 -
LeetCode刷题笔记day15- 347. 前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]链接:https://leetcode-cn.com/problems/top-k-frequent-elements解决方案:①:利用map的key的唯一性,记录每个数字出现的次数②、利用优先队列,通过map中出现次数的多少为比较标准构造数字个数为k的小顶堆③、输出优先队列中的数字clas原创 2021-08-26 11:17:23 · 151 阅读 · 0 评论 -
LeetCode刷题笔记day14-239. 滑动窗口最大值
题目解释:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。输入:nums = [1,3,-1,-3,5,3,6,7], k = 3输出:[3,3,5,5,6,7]解释:滑动窗口的位置 最大值[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3原创 2021-08-25 10:35:59 · 193 阅读 · 0 评论 -
LeetCode刷题笔记day13-将普通表达式转化为逆波兰表达式
将中缀表达式转换为逆波兰式,如“8+(4-2)×5+12/2”,转换为逆波兰式为8 4 2-5 × + 12 2 / +,利用栈这种数据结构,先模拟下详细过程:①、首先遍历字符串数组,第一个数据为8,为数字,直接输出,故此时输出结果res为res = 8②、此时遇到+号,非数字,且栈stack为空,则入栈,stack = +③、遇到(,由于此时左括号优先级最高,故左括号入栈,此时stack = +(④、遇到4,则直接输出此时res = 8 4⑤、遇到-号,因为此时栈顶元素为(,故将+号优先级提升至原创 2021-08-23 14:36:41 · 1374 阅读 · 0 评论 -
LeetCode刷题笔记-day12-逆波兰表达式求值
根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入:tokens = [“2”,“1”,"+",“3”,""]输出:9解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9来源:力扣(LeetCode)链接:https://leetcode-cn.com/problem原创 2021-08-22 15:04:29 · 72 阅读 · 0 评论 -
LeetCode刷题笔记day11-1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:“abbaca”输出:“ca”解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。链接:https://le原创 2021-08-21 14:08:22 · 157 阅读 · 0 评论 -
Leetcode刷题笔记day10-使用栈来实现有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。链接:https://leetcode-cn.com/problems/valid-parentheses利用栈先入后出特点,将字符串便利时,左括号((,{,[)入栈,当遇到右括号时,查看栈顶元素是否与右括号相对应的左括号一致,如匹配则继续循环,如不匹配,则返回false,最终查看栈是否为空,为空则返回true,非空则f原创 2021-08-20 13:47:54 · 64 阅读 · 0 评论 -
LeetCode刷题笔记day09-使用双队列实现栈(代码简洁版)
创建两个队列a,b,当执行push操作时,将元素存入a队列中,然后再将a,b交换,若继续执行push操作,则此时a队列为空,存入a中,判断b中元素是否为空,不为空则添加到a的后面,达到后入先处的效果。如存入1,则a中元素顺序为1,在交换ab则此时a为空,b元素顺序为1再存入2,则a中元素顺序为2,此时b不为空,则将b中元素存入a,a顺序为21循环往复,实现栈先入后出的效果。class MyStack { Queue<Integer>a = null; Queue<I原创 2021-08-20 00:33:16 · 79 阅读 · 0 评论 -
LeetCode刷题笔记day08-使用双队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。链接:https://leetcode-cn.com/problems/implement-stack-using-queues原创 2021-08-19 23:27:34 · 227 阅读 · 0 评论 -
LeetCode刷题笔记day07-请你仅使用两个栈实现先入先出队列
首先呢,对于栈这种数据结构,有着先入后出的特点,同时队列有着先入先出的特点,那么数据在经过两个栈后,最终的返回值刚好是原来数据进入栈中的顺序,所以我们可以用两个栈来实现队列。solution:假定我们有两个栈A,B,首先当我们执行n次push操作时,我们将数据压入栈A中,若执行pop操作时,我们输出的肯定是第一次入栈的元素,所以我们将A中的元素,全部放入B中,此时B的栈顶元素即为我们第一次压入的元素,且B中元素此时的顺序即为我们入栈A的顺序,若此时需要继续push元素入栈,则我们将元素压入栈A中,直到栈B原创 2021-08-18 13:44:09 · 237 阅读 · 0 评论 -
LeetCode刷题笔记day06-重复的字符子串
题目解释:给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例 1:输入: “abab”输出: True解释: 可由子字符串 “ab” 重复两次构成。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/repeated-substring-pattern法一:通过对子串进行迭代,选取最长子串即非空字符串,然后对该子串进行判断,若非空字符串长度为子串的整数倍,则判断子串在非原创 2021-08-16 21:36:33 · 111 阅读 · 0 评论 -
LeetCode刷题笔记day05-KMP算法
KMP算法用来计算文本串是否存在模式串,其主要思想是,通过对模式串进行处理产生前缀表,也称为next数组,来告知当模式串文本串在哪里不匹配时,模式串回退到何处与文本串不匹配位置继续匹配。题目示例:实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于原创 2021-08-15 22:11:19 · 122 阅读 · 0 评论 -
LeetCode刷题笔记day04-剑指 Offer 58 - II. 左旋转字符串
题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = “abcdefg”, k = 2输出: “cdefgab”示例 2:输入: s = “lrloseumgh”, k = 6输出: “umghlrlose”解析:首先最常规的办法是用字符数组存储前n个字符,然后从n+1字符开始直到最后一个字符,移到前面,然后再将原创 2021-08-09 15:57:57 · 112 阅读 · 0 评论 -
LeetCode刷题笔记day03-翻转字符串里的单词
// 目前思路,通过判断第一个字符和最后一个字符是否是空格,来决定当前的字符串的输入形式是哪一种,然后遍历字符串到末尾,通过用指针i指向数组末尾,不断递减,直到遇到第一个不为空格的字母,这时用另一个零时变量j记录当前字母的位置,然后用i继续递减,直到再次遇到空格,则此时倒数第一个单词为s.charAt(i-1)》》s.charAt(j),然后i继续向前直到第二次遇到字母字符,然后重复第一次步骤,存储方式用StringBuilder来存储class Solution { public String.原创 2021-08-08 13:49:48 · 91 阅读 · 0 评论 -
LeetCode刷题笔记day02-把字符串 s 中的每个空格替换成“%20“。
问题:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。策略:新建一个StringBuilder对象,用for循环遍历字符串s,若遇到空格字符就把他替换成%20,若不是,则直接添加如StringBuilder,同时StringBuilder是单线程,运行速度快class Solution { public String replaceSpace(String s) { int len = s.length(); int i =0; String原创 2021-08-07 16:50:01 · 137 阅读 · 0 评论 -
LeetCode刷题笔记day01-反转字符串
反转字符数组和反转链表原理相似,都是通过双指针来进行数据交换,但是由于数组在内存中地址是连续的,但是链表在内存中通过指针来连接的,故在处理方式上会有些许不同,下面是字符数组反转代码class Solution { public void reverseString(char[] s) { int len = s.length; for(int i=0,j=len-1;i<len&&i<j;i++,j--){原创 2021-08-06 12:26:25 · 114 阅读 · 0 评论