LeetCode
凛冬将至__
嵌入式软件开发(驱动开发),文章内容主要为个人学习整理,偏向于实际应用
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【算法】回溯算法套路总结
算法:回溯算法套路总结原创 2023-05-19 17:33:45 · 766 阅读 · 0 评论 -
LeetCode_96 不同的二叉搜索树
1、题目:不同的二叉搜索树给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。2、解题思路动规五部曲1、确定dp数组以及下标的含义,1到i为节点组成的二叉搜索树的个数为dp[i]。2、确定递推公式,3、dp数组如何初始化,4、确定遍历顺序,5、举例推导dp数组,3、代码...原创 2022-04-23 20:38:30 · 1182 阅读 · 0 评论 -
LeetCode_343 整数拆分
1、题目:整数拆分给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。2、解题思路动规五部曲1、确定dp数组以及下标的含义,分拆数字i,可以得到的最大乘积为dp[i]。2、确定递推公式,从1遍历j,然后有两种渠道得到dp[i]。一个是j * (i - j) 直接相乘。一个是j * dp[i - j],相当于是拆分(i - j)。dp[i] = max(dp[i], max((i - j) *原创 2022-04-22 14:40:01 · 935 阅读 · 0 评论 -
LeetCode_63 不同路径 II
1、题目:2、解题思路动规五部曲1、确定dp数组以及下标的含义,2、确定递推公式,3、dp数组如何初始化,4、确定遍历顺序,5、举例推导dp数组,3、代码原创 2022-04-22 14:12:07 · 137 阅读 · 0 评论 -
LeetCode_62 不同路径
1、题目:不同路径一个机器人位于一个 m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?2、解题思路动规五部曲1、确定dp数组以及下标的含义,dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。2、确定递推公式,dp[i][j] = dp[i - 1][j] + dp[i][j - 1].原创 2022-04-21 20:07:39 · 793 阅读 · 0 评论 -
LeetCode_746 使用最小花费爬楼梯
1、题目:使用最小花费爬楼梯给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。请你计算并返回达到楼梯顶部的最低花费。2、解题思路动规五部曲1、确定dp数组以及下标的含义,到达第i个台阶所花费的最少体力为dp[i]2、确定递推公式,可以有两个途径得到dp[i],一个是dp[i-1] 一个是dp[i-2]。选其中最小的,所以d原创 2022-04-21 19:54:40 · 589 阅读 · 0 评论 -
LeetCode_70 爬楼梯
1、题目:爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?2、解题思路爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法。那么第一层楼梯再跨两步就到第三层 ,第二层楼梯再跨一步就到第三层。所以到第三层楼梯的状态可以由第二层楼梯 和 到第一层楼梯状态推导出来,那么就可以想到动态规划了。动规五部曲1、确定dp数组以及下标的含义, 爬到第i层楼梯,有dp[i]种方法2、确定递推公式,首先是dp[原创 2022-04-21 19:44:43 · 135 阅读 · 0 评论 -
动态规划小结
1、动规五部曲1、确定dp数组以及下标的含义2、确定递推公式3、dp数组如何初始化4、确定遍历顺序5、举例推导dp数组原创 2022-04-21 19:39:26 · 184 阅读 · 0 评论 -
LeetCode_509 斐波那契数
1、题目:斐波那契数斐波那契数(通常用F(n) 表示)形成的序列称为 斐波那契数列 。该数列由0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1)= 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给定n ,请计算 F(n) 。2、解题思路动规五部曲1、确定dp数组以及下标的含义,第i个数的斐波那契数值是dp[i]2、确定递推公式,状态转移方程 dp[i] = dp[i - 1] + dp[i ...原创 2022-04-21 19:38:03 · 372 阅读 · 0 评论 -
LeetCode_968 监控二叉树
1、题目:监控二叉树给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。2、解题思路先给叶子节点父节点放个摄像头,然后隔两个节点放一个摄像头,直至到二叉树头结点。如何考虑所有情况是很困难的,首先定义三种状态,0:该节点无覆盖,1:本节点有摄像头,2:本节点有覆盖。有二叉树,很大概率就是用递归1、确定递归函数的参数和返回类型,返回值就是节点的状态,参数就是当前节点是哪个2、确定终原创 2022-04-20 21:44:08 · 174 阅读 · 0 评论 -
LeetCode_738 单调递增的数字
1、题目:单调递增的数字当且仅当每个相邻位数上的数字x和y满足x <= y时,我们称这个整数是单调递增的。给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。2、解题思路从后往前遍历,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]--,然后strNum[i]给为93、代码class Solution {public: int monotoneIncreasingDigits...原创 2022-04-20 21:23:23 · 201 阅读 · 0 评论 -
LeetCode_56 合并区间
1、题目:合并区间以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。2、解题思路和打气球非常相似,就是将所有能够重叠的区域合并LeetCode_452 用最少数量的箭引爆气球_W__winter的博客-优快云博客3、代码class Solution {public: // 按照区间左边界从小到大排..原创 2022-04-20 14:12:29 · 153 阅读 · 0 评论 -
LeetCode_763 划分字母区间
1、题目:划分字母区间字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。2、解题思路在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。1、统计每一个字符最后出现的位置2、从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点3、代码原创 2022-04-20 13:52:37 · 176 阅读 · 0 评论 -
LeetCode_435 无重叠区间
1、题目:无重叠区间给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。2、解题思路此题在逻辑上非常困难,1、按照右边界排序2、从左往右遍历,得到不重叠的右边界最小的区间3、代码class Solution {public: // 按照区间右边界排序 static bool cmp (const vector<int>& .原创 2022-04-20 13:39:17 · 421 阅读 · 0 评论 -
LeetCode_452 用最少数量的箭引爆气球
1、题目:用最少数量的箭引爆气球有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组points,其中points[i] = [xstart, xend]表示水平直径在xstart和xend之间的气球。你不知道气球的确切 y 坐标。一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart≤ x ≤ xend,则该气球会被 引爆。可以射出的弓箭的数量 没...原创 2022-04-20 12:55:14 · 373 阅读 · 0 评论 -
LeetCode_406 根据身高重建队列
1、题目:根据身高重建队列假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。2、解题思路先按照身.原创 2022-04-20 12:09:34 · 624 阅读 · 0 评论 -
LeetCode_860 柠檬水找零
1、题目:柠檬水找零在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。 注意,一开始你手头没有任何零钱。 给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。2、解题思路情况一:账单.原创 2022-04-19 20:47:12 · 194 阅读 · 0 评论 -
LeetCode_135 分发糖果
1、题目:分发糖果n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。2、解题思路如果ratings[i] > ratings[i - 1] 那么[i]的糖 一定要比[i - 1]的糖多一个,所以贪心:candyVec[i] = candyVec[i - 1] + 1如果.原创 2022-04-19 20:15:20 · 208 阅读 · 0 评论 -
LeetCode_134 加油站
1、题目:加油站在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。2、解题思路情况一:如果gas的总和小于cost总和,那么无论从哪里出发,一定是跑不了一圈的。.原创 2022-04-19 19:18:26 · 581 阅读 · 0 评论 -
LeetCode_1005 K次取反后最大化的数组和
1、题目:K次取反后最大化的数组和给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:选择某个下标 i并将 nums[i] 替换为 -nums[i] 。重复这个过程恰好 k 次。可以多次选择同一个下标 i 。以这种方式修改数组后,返回数组 可能的最大和 。2、解题思路3、代码...原创 2022-04-19 13:24:12 · 147 阅读 · 0 评论 -
LeetCode_45 跳跃游戏II
1、题目:跳跃游戏II给你一个非负整数数组nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。2、解题思路要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最小步数!这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖。如果移动下标达到了当前这一步的最大覆盖最远距.原创 2022-04-18 21:25:58 · 154 阅读 · 0 评论 -
LeetCode_55 跳跃游戏
1、题目:跳跃游戏给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。2、解题思路每次取最大跳跃步数(取最大覆盖范围),最后得到整体最大覆盖范围,看是否能到终点。3、代码class Solution {public: bool canJump(vector<int>& nums) { int cover = 0;原创 2022-04-18 20:16:23 · 1936 阅读 · 0 评论 -
LeetCode_122 买卖股票的最佳时机II
1、题目:买卖股票的最佳时机II给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。 返回 你能获得的 最大 利润 。2、解题思路实际上就是求两天之间是赚钱还是亏钱,赚钱的话就加到结果里面去。3、代码class Solution {public: int maxProfit(vector<int>原创 2022-04-18 20:07:38 · 522 阅读 · 0 评论 -
LeetCode_53 最大子序和
1、题目:最大子序和给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。2、解题思路遍历nums,从头开始用count累积,如果count一旦加上nums[i]变为负数,那么就应该从nums[i+1]开始从0累积count了。3、代码class Solution {public: int maxSubArray(vector<int>& nums) {原创 2022-04-18 19:26:40 · 438 阅读 · 0 评论 -
LeetCode_376 摆动序列
1、题目:摆动序列如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。例如,[1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3)是正负交替出现的。相反,[1, 4, 7, 2, 5]和[1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。子序列 可以...原创 2022-04-18 15:36:45 · 231 阅读 · 0 评论 -
LeetCode_455 分发饼干
1、题目:分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j]。如果 s[j]>= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。2、解题思路大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。...原创 2022-04-18 15:16:48 · 164 阅读 · 0 评论 -
LeetCode_37 解数独
1、题目:解数独编写一个程序,通过填充空格来解决数独问题。数独的解法需 遵循如下规则:数字1-9在每一行只能出现一次。数字1-9在每一列只能出现一次。数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。(请参考示例图)数独部分空格内已填入了数字,空白格用'.'表示。2、解题思路回溯三部曲。1、确定递归函数的参数和返回类型,递归函数的返回值需要是bool类型,因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一...原创 2022-04-18 15:11:14 · 435 阅读 · 0 评论 -
LeetCode_51 N皇后
1、题目:2、解题思路3、代码原创 2022-04-18 14:54:47 · 153 阅读 · 0 评论 -
LeetCode_332 重新安排行程
1、题目:重新安排行程给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前。假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且原创 2022-04-17 21:33:27 · 606 阅读 · 0 评论 -
LeetCode_47 全排列 II
1、题目:全排列 II给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。2、解题思路这道题目和46.全排列 的区别在与给定一个可包含重复数字的序列,要返回所有不重复的全排列。这里又涉及到去重了。在40.组合总和II、90.子集II 我们分别详细讲解了组合问题和子集问题如何去重。LeetCode_40 组合总和II(剪枝操作好好理解)_W__winter的博客-优快云博客3、代码class Solution {private: v.原创 2022-04-17 16:20:47 · 180 阅读 · 0 评论 -
LeetCode_46 全排列
1、题目:全排列给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。2、解题思路回溯三部曲1、确定递归函数的参数和返回类型,可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。但排列问题需要一个used数组,标记已经选择的元素。2、确定终止条件,当收集元素的数组path的大小达到和nums数组一样大的时候,说明找到了一个全排列,也表示到达了叶子节点。if ...原创 2022-04-17 15:42:57 · 317 阅读 · 0 评论 -
LeetCode_491 递增子序列
1、题目:递增子序列给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。2、解题思路回溯三部曲1、确定递归函数的参数和返回类型,本题求子序列,很明显一个元素不能重复使用,所以需要startIndex,调整下一层递归的起始位置。vector<vector<int>> result;vector&.原创 2022-04-17 15:21:54 · 412 阅读 · 0 评论 -
LeetCode_90 子集II
1、题目:子集II给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。2、解题思路这道题目和78.子集 区别就是集合里有重复元素了,而且求取的子集要去重。 那么关于回溯算法中的去重问题,在40.组合总和II中已经详细讲解过了,和本题是一个套路。 LeetCode_40 组合总和II(剪枝操作好好理解)_W__winter的博客-优快云博客3、代码class原创 2022-04-17 15:03:56 · 128 阅读 · 0 评论 -
LeetCode_78 子集
1、题目:子集给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。2、解题思路回溯三部曲1、确定递归函数的参数和返回类型,全局变量数组path为子集收集元素,二维数组result存放子集组合。子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开.原创 2022-04-17 15:00:18 · 274 阅读 · 0 评论 -
LeetCode_93 复原IP地址
1、题目:复原IP地址有效IP地址正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。例如:"0.1.2.201"和"192.168.1.1"是有效IP地址,但是"0.011.255.245"、"192.168.1.312"和"192.168@1.1"是无效IP地址。给定一个只包含数字的字符串s,用以表示一个IP地址,返回所有可能的有效IP地址,这些地址可以通过在s中插入'.'来形成。你不...原创 2022-04-17 14:51:49 · 346 阅读 · 0 评论 -
LeetCode_131 分割回文串
1、题目:分割回文串给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。2、解题思路回溯三部曲1、确定递归函数的参数和返回类型,全局变量数组path存放切割后回文的子串,二维数组result存放结果集。本题递归函数参数还需要startIndex,因为切割过的地方,不能重复切割,和组合问题也是保持一致的。vector<vector<string>> result;原创 2022-04-17 14:31:59 · 256 阅读 · 0 评论 -
LeetCode_40 组合总和II(剪枝操作好好理解)
LeetCode_40 组合总和II原创 2022-04-17 14:13:41 · 400 阅读 · 0 评论 -
LeetCode_39 组合总和
1、题目:组合总和给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。说明:所有数字(包括target)都是正整数。 解集不能包含重复的组合。示例 1: 输入:candidates = [2,3,6,7], target = 7, 所求解集为: [ [7], [2,2,3] ]示例2: 输入:candidates = [2,3,5...原创 2022-04-17 12:06:15 · 233 阅读 · 0 评论 -
LeetCode_17 电话号码的字母组合
1、题目:电话号码的字母组合给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。2、解题思路数字和字母如何映射//可以用map,也可以用二维数组const string letterMap[10] = { "", // 0 "", // 1 "abc", // 2 "def", // 3 "ghi", // 4 "j...原创 2022-04-16 17:07:43 · 159 阅读 · 0 评论 -
LeetCode_216 组合总和III
1、题目:组合总和III找出所有相加之和为n 的k个数的组合,且满足下列条件:只使用数字1到9每个数字最多使用一次返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。2、解题思路思路非常类似于77题,在77基础上加上sum值来判断已经收集的值是否等于题目要求的和。接下来就是剪枝操作,已选元素总和如果已经大于n了,那么往后遍历就没有意义了,直接剪掉。LeetCode_77 组合_W__winter的博客-优快云博客3、代码...原创 2022-04-16 16:48:22 · 482 阅读 · 0 评论
分享