- 博客(56)
- 收藏
- 关注
原创 位图法-有效的数独
每行每列用二重循环,每宫比较复杂,需要考虑每一宫的坐标与二重循环ij对应关系。有效的数独,主要是判断每行每列每宫有无重复元素。行i,每一宫3行,3列。
2024-06-18 10:37:01 198
原创 力扣算法-----一刷总结
尤其是动态规划,如果是自己胡乱看,几乎很难成体系的学习,同时动态规划的内容也是最多的,连着学习了三周,可以说是睁开眼睛又是动态规划,哈哈哈哈哈哈哈,不过好在坚持下来总是有收获的,对于递推公式的推导和遍历顺序、初始化都有了新的认识,二刷争取能自己慢慢实现。过去的两个月,中间伴着各种琐事,但还是坚持了下来,走过了数组、链表、哈希表、字符串、双指针、栈和队列、二叉树、回溯算法、贪心算法、以及最后的动态规划和单调栈。学习不是一蹴而就的,可能每天只能进步一点点,所以需要更多的坚持和努力。
2023-11-08 11:31:02 255
原创 day63--单调栈3
先让栈按照从栈底到栈顶从小到大的顺序排列,如果出现了当前元素小于栈顶元素的时候,如状态132的凸字形,,,left为栈顶元素,right为当前元素,求得矩形的宽,然后高就是栈顶元素,最后求result=Max(result,w*h);给定 n 个非负整数,用来表示柱状图中各个柱子的高度。接雨水利用的是3个柱子形成一个凹槽,类似于213这样的形状,在1里面蓄水。2个月的学习完结,,,撒花✿✿ヽ(°▽°)ノ✿!而本题找的是每个柱子左右两边第一个小于该柱子的柱子。求在该柱状图中,能够勾勒出来的矩形的最大面积。
2023-11-08 11:04:00 322
原创 day61--单调栈2
503.下一个更大元素II42. 接雨水第一题:下一个更大元素2给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。0、与单调栈思路相同,不过本题需要循环数组关于处理循环数组,简单的方法就是讲数组复制一遍,然后将两个数组拼接起来,用单调栈求下一个最大值,拼接一次肯定可以找到下一个最大值或者直接把数组走两遍。
2023-11-08 10:42:15 143
原创 day60--单调栈1
739. 每日温度496.下一个更大元素 I第一题:每日温度请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。计算公式:首先第一个元素入栈。
2023-11-05 10:57:59 136
原创 day58--动态规划16
583. 两个字符串的删除操作72. 编辑距离编辑距离总结篇第一题:两个字符串的删除操作给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。相比之前的题,本题特点在于:找到两个字符串中相同的子串,两边都可以删除操作,子串的相对排列顺序不变。动态规划五部曲:(1)确定dp数组以及下标的含义。
2023-11-02 10:50:45 71
原创 day53--动态规划12
309.最佳买卖股票时机含冷冻期714.买卖股票的最佳时机含手续费第一题:.最佳买卖股票时机含冷冻期给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格。设计一个算法计算出最大利润。相比之前的股票问题,多了一个情况,卖出股票后无法在第二天买入股票,也就是说卖出后必须等待1天才能对股票进行操作。动态规划五部曲:(1)确定dp数组以及下标的含义dp[i][j],第i天的状态为j,所剩的最多现金为dp[i][j]几个状态:状态一:持有股票(不管是今天买入,或者昨天买入,但手上有股票)
2023-10-28 13:22:04 89
原创 day49--动态规划8
不论题目如何描述,涉及容量的是背包,涉及价值体积数量的是物品。确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组重点在递推公式,初始化根据递推公式决定dp[0]的值1. 问能否装满背包(或者最多装多少):dp[j]=max(dp[j],dp[j-nums[i]]+nums[i]);分割等和子集:用一个容量为sum/2的背包装子集最后一块石头的重量:同理,用一个容量为sum/2的背包装子集,并求最后剩下的。
2023-10-25 10:48:59 51
原创 day46--动态规划6
完全背包518. 零钱兑换 II377. 组合总和 Ⅳ第一题:完全背包有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。,求解将哪些物品装入背包里物品价值总和最大。。跟01背包的实现区别在哪里?物品是从小到大遍历,装到装不了然后再从小的开始。
2023-10-23 16:06:00 36
原创 day45--动态规划5
1049. 最后一块石头的重量 II494. 目标和474.一和零第一题:最后一块石头的重量 II有一堆石头,每块石头的重量都是正整数。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x!= y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头最小的可能重量。如果没有石头剩下,就返回 0。
2023-10-20 10:45:33 44
原创 day39--贪心算法6
简单题:分发饼干(满足多条件);K次取反后最大化的数组和;柠檬水找零(只有5,10,20,尽可能先用10)中等题:摆动序列(差值正负摆动);单调递增的数字(选相邻两位做判断)股票问题:(买进卖出的时机)两个维度权衡:(先确定一个维度,然后确定另一个维度),分发糖果(相邻两者要求不同);身高重排队列难题:区间问题(跳跃游戏,射气球,重叠区间,划分字母区间,合并区间),其中除了划分字母区间和跳跃游戏外,其余都跟左右边界有关,将左右边界作为切入点,判断、计算等。
2023-10-16 15:01:33 32
原创 day38--贪心算法5
对于区间重叠问题,处理思想都是对左边界,或者右边界进行判断首先需要排序(可以以左边界,也可以以右边界)然后根据题目要求,需要一个标志记录首个边界位置,然后对比标志和第二个区间的边界(左或者右),如果存在存在重叠,肯定两者的边界有大小区别最后就是迭代,对区间挨个处理,找出需要的结果。
2023-10-16 13:14:34 32
原创 day37--贪心算法4
860.柠檬水找零 在柠檬水摊上,每一杯柠檬水的售价为 美元。顾客排队购买你的产品,(按账单 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 美元、 美元或 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 美元。注意,一开始你手头没有任何零钱。给你一个整数数组 ,其中 是第 位顾客付的账。如果你能给每位顾客正确找零,返回 ,否则返回 。其实一共三种情况:(1)账单是5,直接收下;(2)账单是10,消耗一个5,增加一个10(3)账单是20,优先消耗一个10和
2023-10-13 11:22:51 52
原创 补day35--贪心算法2
122.买卖股票的最佳时机II55. 跳跃游戏45.跳跃游戏II第一题:买卖股票的最佳时机2给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。思路:就是控制买进卖出之间获得最大利润,比如价格趋势是1234521,在第2天买进(-2),在第4天卖出(2)。
2023-10-12 10:50:04 24
原创 补day34--贪心算法1
理论基础455.分发饼干376. 摆动序列53. 最大子序和贪心算法没有规律?难点在于怎么划分局部,以及求得局部最优可分为四步:(其实还是两步,找出局部最优,然后推导出全局最优)(1)将问题分解为若干个子问题(2)找出适合的贪心策略(3)求解每一个子问题的最优解(4)将局部最优解堆叠成全局最优解。
2023-10-11 10:44:41 30
原创 补day32-回溯算法6
回溯大体逻辑void backtracking(参数){if(终止条件){存放结果;return;for(选择:本层集合中元素(树中节点孩子的数量就是集合的大小)){处理节点;backtracking(路径,选择列表);//递归回溯,撤销处理结果;1、组合问题横向是数组长度,纵向是结果的深度,终止条件常源于此。通过对树进行剪枝,控制结果,比如求和小于target的组合;通过使用startIndex实现去重,循环的起始位置。
2023-10-10 16:16:44 28
原创 补day31 --回溯算法5
491.递增子序列* 46.全排列* 47.全排列 II第一题:递增子序列给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。思路:重点在去重逻辑上,原来的标记数组在这里达不到去重的目的;还有一个重点在于先排序,本题不能先排序然后求子集,而是根据原始序列求子集1、回溯三部曲(1)递归函数的参数(2)递归终止条件第一层的节点不取,其他层节点都要取(3)单层递归逻辑同一父节点下不选择相同元素,不使用used数组进行判断,而是利用哈希set搜索。
2023-10-10 10:53:31 25
原创 补day29-回溯3
39. 组合总和40.组合总和II131.分割回文串第一题:组合总和给你一个的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的 所有,并以列表形式返回。你可以按返回这些组合。0、思路:数组内的元素可以重复选择,树的深度不受限,直到数组的和为target,然后返回代码随想录的第二层思想选了a,第二个分支就不考虑a1、递归三部曲(1)递归函数参数以及定义变量。
2023-10-08 15:44:21 27
原创 补day27--回溯算法1
void backtracking(int n,int k ,int startIndex) //集合n中取k个数,而startIndex用于控制下一层的递归,避免重复。关于为什么sum要加了再减,sum是用来寻找合适的值,所以加了然后递归进去判断,为什么要减,是因为一个叶子节点判断完,需要回去判断另一个叶子;示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]找出所有相加之和为 n 的 k 个数的组合。
2023-10-07 22:07:02 33
原创 补day21--二叉树7
530.二叉搜索树的最小绝对差501.二叉搜索树中的众数236. 二叉树的最近公共祖先第一题:二叉搜索树的最小绝对差给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。二叉搜索树是有序的,所以求最值或者差值可以理解为在一个有序数组上操作。1、递归法:直接用遍历方法得到一个数组,然后再对数组进行遍历,求得最小的差值2、双指针方法用一个pre结点记录一下cur节点的前一个节点;这里的指针就是一个TreeNode*变量、
2023-10-05 21:07:57 42
原创 补day18--二叉树part5
非要说有什么不同,本题前序遍历的方向不一样:根左右,所以确定根节点值的时候,直接放前序数组的第一个值;给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。思路:本题和上一题思路一样,步骤也一样,前序遍历可以确定根节点,然后在中序遍历中切割成两个数组。1.相比原来的层序遍历,本题不需要记录所有结点的值,只需要一个result记录一个结点的值就可以了。计数器可以往上增,累和,也可以往下减,如果最后为0 ,则说找到了满足条件的路径;0.首先中序:左根右;
2023-10-04 21:49:14 54 1
原创 补day17-二叉树4
分别求出当前节点的左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。递归的过程中依然是遇上了空节点为终止,返回0,表示当前节点为根节点的树高度为0。1.高度平衡的二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1;前序遍历:根左右,根在前,子节点在后,方便父节点指向孩子节点,找到对应的路径。返回值:以当前传入节点为根节点的树的高度。不为空,且左孩子的左右孩子都为空,这样的A节点的左孩子才是左叶子。0.基础:二叉树的节点的深度。
2023-10-04 19:29:12 64 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人