刷题笔记
文章平均质量分 75
提升自我
NewBee_Lxx
记录学习
展开
-
283. 移动零 11. 盛最多水的容器 3. 无重复字符的最长子串 560. 和为 K 的子数组
计算两个边的盛水量并更新数值。双指针一个在头 一个在尾部。左右两边 哪边矮就移动哪边。把非零的数全交换到前面去。原创 2024-05-01 16:57:25 · 105 阅读 · 0 评论 -
不同路径 不同路径 II 整数拆分
此时在回顾一下 dp[i - 1][j] 表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径,dp[i][j - 1]同理。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。可以想 dp[i]最大乘积是怎么得到的呢?原创 2024-03-10 21:41:49 · 844 阅读 · 0 评论 -
不同的二叉搜索树 01背包
举例,n 为 7,那么当头结点是 5 的时候,将 1,2,3,4,6,7 这几个数字放进去,根据二叉搜索树定义,左子树小右子树大,那么 1,2,3,4只能在左子树,6,7在右子树中,也就是说 左子树由四个数构成一颗二叉搜索树,右子树有两个数构成一颗二叉搜索树,这里右子树的 6,7 可以看成 1,2,因为把头结点 5 不看的话,1,2 构成的二叉搜索树和 6,7 构成的二叉搜索树的个数是一样的。在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。去练习,题意是一样的。原创 2024-03-12 18:18:36 · 533 阅读 · 0 评论 -
分割等和子集 最后一块石头的重量II 目标和
力扣题目链接(opens new window)那么分成两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target]。在计算target的时候,target = sum / 2 因为是向下取整,所以sum - dp[target] 一定是大于等于dp[target]的。那么相撞之后剩下的最小石头重量就是 (sum - dp[target]) - dp[target]。public:i++) { // 遍历物品j--) { // 遍历背包。原创 2024-03-16 02:07:24 · 837 阅读 · 0 评论 -
买卖股票的最佳时机1,2,3
max(和前一天一样已经持有了第二张股票,在前一天已经的卖出第一张股票的基础上买入第二张股票)max(和前一天一样已经卖出了第一支股票了,在前一天持有第一支股票的基础上卖出这只股票)max(和前一天一样已经持有了第一张股票,在前一天不操作的基础上今天买入股票)解决方法不同的就是 如果第i天买入股票的时候 价值是i-1天不持有股票的钱数加上这只股票的价值。第i天持有股票:两种情况 第一种是昨天就已经持有股票了 所以跟昨天一样就好。初始化:第0天持有股票 第0天不持有股票。4 表示第二次不持有股票。原创 2024-03-20 14:48:16 · 489 阅读 · 0 评论 -
最长递增子序列,最长。。。
dp[i][j] :以下标i 为结尾的A,和以下标j 为结尾的B,最长重复子数组长度为dp[i][j]。如果nums【i】=nums【j】那么 dp[i][j] = dp[i-1][j-1] +1。nums【i】的可以拼接到dp【j】上形成一个新的递增子序列,长度加一。dp[i][j]是以他的左上角dp[i-1][j-1]推倒出来的。nums[i]与nums[j]比较。i每到一个新的位置 j都会从头开始。如果nums[i]>nums[j]因为nums[i]>nums[j]原创 2024-03-21 20:33:39 · 296 阅读 · 0 评论 -
回文子串 每日温度 接雨水
用result记录一下 把栈顶元素pop掉 while继续与下一个栈顶元素比较。因为要接雨水 要在左边和右边选一个矮的高度再减去槽底的高度 就是雨水的高。然后把栈顶pop出去 新的栈顶就是槽的左边 现在的i是槽的右边。如果等于栈顶元素 把之前的数pop出去 新的数push进来。如果这个数小于等于栈顶元素 就把这个数的下表放进栈。如果大于栈顶元素 说明找到凹槽了 可以接雨水了。就说明这个元素是第一个比栈顶元素大的数。槽的右边减去槽的左边再减1就是槽的宽度。先把第一个元素的下标放进栈。如果这个数大于栈顶元素。原创 2024-03-24 19:46:41 · 440 阅读 · 0 评论 -
斐波那契数 爬楼梯 使用最小花费爬楼梯
力扣题目链接(opens new window)斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你n ,请计算 F(n) 。状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];n+1:0-n有n+1个数字只需要维护数组的两个数即可,不用维护整个数组: 力扣题目链接(ope原创 2024-03-09 13:39:11 · 669 阅读 · 0 评论 -
划分字母区间 合并区间 单调递增的数字
我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x原创 2024-03-08 14:12:49 · 364 阅读 · 0 评论 -
全排列 全排列 II N皇后
递归终止条件:当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。先排序,树层去重,123,132可以出现所以不用index,一次排列用过的元素不能再用了 所以设置used数组。(1)确定参数及返回值:返回类型为void型,参数n为棋盘大小,row记录到第几层。给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。(2)返回条件:当遍历到棋盘的最后一层,就可以收集结果并返回。原创 2024-03-01 21:54:18 · 474 阅读 · 0 评论 -
贪心:分发饼干 最大子序和 买卖股票的最佳时机 II 跳跃游戏 跳跃游戏 II
对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。原创 2024-03-03 23:38:12 · 402 阅读 · 0 评论 -
K次取反后最大化的数组和 加油站 分发糖果 柠檬水找零
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。题意在下标2的加油站会给你2的油量 去到三会消耗8的油量并加上3的油量。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。原创 2024-03-05 22:07:46 · 918 阅读 · 0 评论 -
根据身高重建队列 用最少数量的箭引爆气球 无重叠区间
在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]原创 2024-03-06 11:45:30 · 875 阅读 · 0 评论 -
分割回文串 复原IP地址 子集 递增子序列
例如:"0.1.2.201" 和 "192.168.1.1" 是 有效的 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效的 IP 地址。示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]示例: 输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ]原创 2024-02-29 19:14:55 · 301 阅读 · 0 评论 -
有效的括号 删除字符串中的所有相邻重复项 逆波兰表达式求值
输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]思路就是定义一个栈 遇见数字就往栈里放 如果遇见符号 就把栈里的头两个元素拿出来与符号结合运算 运算结果再放入栈里面 最后栈里只剩下一个元素就是运算结果。给定逆波兰表达式总是有效的。给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。先定义一个栈 遍历 如果栈为空就往里添加元素 如果不同就进栈 如果相同就出栈。原创 2023-08-05 20:55:54 · 48 阅读 · 1 评论 -
两两交换链表中的节点 删除链表的倒数第N个节点 面试题 链表相交 环形链表II
这题需要用虚拟头节点 自己没用虚拟头节点直接head做出来总报错 应该是头节点的各种特殊情况导致 链表还是用dummy比较好。快指针和慢指针相遇后 再定义两个指针一个从头走 一个从相遇的点继续走 再次相遇就是入口。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。快指针走到null的时候 使慢指针正好到达要删除的节点的前一个节点。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。让cur一直保持再交换的两个节点的前面。原创 2023-07-30 14:23:02 · 405 阅读 · 1 评论 -
有序数组的平方 长度最小的子数组 螺旋矩阵II
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。最大数只能出现在两边不能出现在中间 所以两个指针一个在前 一个在后 平方后比较 大的进新数组里面。假如数组【1,1,1,1,100】while能连续判断 而if一次就结束了。i原创 2023-07-28 17:02:00 · 652 阅读 · 0 评论 -
二分查找 移除元素
示例: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。right = nums.size()-1 因为nums.size()为数组长度 左闭右闭以它为下标取数组最右侧是不合法的,所以需要-1才能指向数组最后一个元素。因为[1,1)是不合法的所以不能取 = 所以left原创 2023-07-27 16:16:38 · 717 阅读 · 1 评论 -
用栈实现队列 用队列实现栈
使用栈实现队列的下列操作:push(x) -- 将一个元素放入队列的尾部。pop() -- 从队列首部移除元素。peek() -- 返回队列首部的元素。empty() -- 返回队列是否为空。思路就是用两个栈 in 栈和 out 栈push操作就是 把元素全push到in栈里pop操作 先看out栈是否为空 如果为空把in栈里的元素全部放out栈里 再从out栈里pop。原创 2023-08-04 22:12:33 · 36 阅读 · 1 评论 -
反转字符串 反转字符串II 剑指Offer 05.替换空格 翻转字符串里的单词 剑指Offer58-II.左旋转字符串
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。请实现一个函数,把字符串 s 中的每个空格替换成"%20"。每次循环看把i的后k个数反转 如果不够k个就全部反转。输入: s = "abcdefg", k = 2。reverse库函数是左闭右开[ )原创 2023-08-03 23:47:47 · 56 阅读 · 0 评论 -
移除链表元素 反转链表
示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL。cur为什么不等于head:因为是单向链表 cur要在最前面 要不然找不到上一个节点。示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]示例 2: 输入:head = [], val = 1 输出:[]链表中插入元素是要下边的先指向前边的然后后面的再指向下面的。原创 2023-07-29 17:38:32 · 497 阅读 · 0 评论 -
有效的字母异位词 两个数组的交集 快乐数 两数之和
快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。示例 1: 输入: s = "anagram", t = "nagaram" 输出: true。示例 2: 输入: s = "rat", t = "car" 输出: false。原创 2023-07-31 15:34:31 · 351 阅读 · 1 评论 -
四数相加II 赎金信 三数之和 四数之和
当遇到-1 -1 2的时候这种情况会直接被跳过忽略 因为审题意 要求不能有重复的数组 但是没有要求每个数组中的元素不可以重复 当i再次指向下一个-1的时候 如果数组是-1 -1 -1 2 则会重复 因为数组排过序i再次指向-1后 如果要三个元素相加还是等于0的情况下 只能还是-1 -1 2这种情况 这样会与上次情况产生重复。给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。原创 2023-08-02 00:03:16 · 143 阅读 · 0 评论 -
654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
先找到数组里面最大值然后把他设为根节点 然后以根节点为中心分割 左边的构成左子树 右边的构成右子树 左边中的最大值为左子树的根节点 右边数组里的最大值为右子树的根节点。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。返回以该节点为根的子树。终止条件:如果传入的数组的大小为1的时候说明传入到了叶子节点 所以创建一个节点 将其赋值并返回。通过给定的数组构建最大二叉树,并且输出这个树的根节点。返回值是新树的根节点 传入的是两个树的根节点。原创 2023-09-24 16:08:18 · 34 阅读 · 1 评论 -
通过递归求二叉数深度理解递归
最重要的就是递归就是函数调用自己一直往下走 然后有一个栈一直装 然后一直走到终止函数 一般会返回一个数 然后栈从栈顶到栈底一直返回 最后得到结果。所以进行第二步骤也就是第二个格子:int l = maxDepth(root->left) 递归调用自己 跳到B节点。D第一个条件也不满足 第二个条件返回0 第三个条件返回0 第四个条件返回1。同样B第一个格子不满足画叉 进入第二个格子 栈中继续装入 跳到节点D。然后1返回到B的第二个格子 B再进行第三个格子的计算。原创 2023-09-05 18:28:07 · 78 阅读 · 1 评论 -
104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数
先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。原创 2023-08-30 18:07:20 · 31 阅读 · 1 评论 -
239. 滑动窗口最大值 347.前 K 个高频元素
每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。pop移除元素:每次移动窗口要删除的和窗口最左边的元素如果和队列中的front元素相同就删除队列中front的元素 不相同就不用操作。push增加元素:每次从队列的back添加 如果前面的数比要添加的数小就把前面的数删掉直到前面没有更大的数为止。原创 2023-08-07 23:34:11 · 33 阅读 · 0 评论 -
235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。终止条件 遇见空节点说明到叶子节点的下一位了 说明找到插入的位置了 创建一个新节点放入值并返回这个节点。第二种情况是删除节点 左不为空 右为空 只需要返回要删除节点的的左子树即可(并把要删除的节点释放内存)如果要删除的节点在根节点的左子树里面 就用根节点的左也就是root->left去接递归返回回来的左子树。那么就把要删除节点的左子树 拼接到要删除节点的右子树的最左孩子的左边。原创 2023-10-04 15:33:25 · 55 阅读 · 1 评论 -
二叉数的遍历
先把头节点放入栈里 然后while循环 定义node记录栈顶元素然后pop出去 进入数组 之后先把右节点压入栈再把左节点压入栈(因为栈是先进后出)栈为空停止循环。非递归思路是酷酷往栈里存 一直往左存到栈的最左面 然后cur为空了就 else了取出栈顶元素储存然后pop掉 打印到数组中 然后cur=cur的右节点。while条件解释:通过动画演示可以看出过程中cur可以为空 栈也可以为空 如果两方都空了才是结束了。原创 2023-08-11 15:28:59 · 28 阅读 · 1 评论 -
669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 108.将有序数组转换为二叉搜索树
你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。为什么不直接rerturn root->right : 因为该节点的右侧也有可能有数值不在范围内的节点需要删除 仍需要接着遍历 如果直接return了就不会再继续遍历了 可能会有遗留节点没有检测到。给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。如果遇见的节点值小于这个范围 那么就删除这个节点。原创 2023-10-04 23:46:31 · 51 阅读 · 1 评论 -
530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先
双指针法遍历一遍: pre==NULL说明cur指向第一个元素所以count=1,如果下一个数跟这个数相同就count++,不同count重新变成1,如果count=maxCount就把该数储存到结果集里 maxCount一直更新 每次更新则会清空结果集 并且放入新的结果。如何实现:当cur指向第一个节点的时候 pre指向空 控制条件当pre不等于空的时候开始取差值 也就是cur指向第二个节点的时候。给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。原创 2023-10-03 00:32:47 · 63 阅读 · 0 评论 -
110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。运用递归 函数返回值是该节点的高度先确定终止条件 node==NULL说明到空节点没有高度 返回0先取得左节点高度 再取得右节点高度 如果高度值为-1直接 return -1求左右节点的高度差 取绝对值 如果高度差大于1则让result= -1如果正常则返回该节点高度result。原创 2023-09-04 21:36:38 · 34 阅读 · 1 评论 -
513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。从中序数组哪里找到根节点的位置 根节点的左侧则是左子树的部分 根节点的右侧则是右子树的部分。后续数组的最后一个元素当了根节点所有去除最后一个元素 新的末尾元素是新的根节点。终止条件遇到叶子结点 获取该节点的值 更新到最低点也就是最后一层的值。然后进行分割中序数组 根节点的左右部分 但不包括根节点。说明: 叶子节点是指没有子节点的节点。后续数组的最后一个元素就是根节点。原创 2023-09-17 23:25:05 · 52 阅读 · 1 评论 -
102.二叉树的层序遍历 226.翻转二叉树 101. 对称二叉树
先把头节点放入队列 然后size记录每一层的元素个数 pop完每个节点后都会将他的左右节点加入队列。给你一个二叉树,请你返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)所以剩下的最后一种情况就是左右相等 然后进行讨论。给定一个二叉树,检查它是否是镜像对称的。如果都返回true则证明对称。左的外侧 和 右的外侧比较。左的内测 和 右的内测比较。但是递归方法还是没太懂。原创 2023-08-24 20:05:15 · 27 阅读 · 1 评论 -
回溯算法,77. 组合(优化) 216. 组合总和 III 17.电话号码的字母组合
回溯法可以抽象成树形结构集合的大小构成了树的宽度,递归的深度构成的树的深度。回溯法是在递归的基础上 加上for循环 在树形结构中for循环是为了横向遍历 递归是纵向遍回溯模板返回值一般为voidif是遍历到叶子节点 找到其中的一个结果 存入 并结束本层递归for循环是横向遍历 if终止条件是为了控制for循环几次回溯撤回本次结果中的一个 然后方便下一个元素进入。原创 2023-12-13 00:20:59 · 370 阅读 · 0 评论