经典动态规划:最长公共子序列读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
1143. Longest Common Subsequenceopen in new window
1143. 最长公共子序列open in new window
🟠
583. Delete Operation for Two Stringsopen in new window
583. 两个字符串的删除操作open in new window
🟠
712. Minimum ASCII Delete Sum for Two Stringsopen in new window
712. 两个字符串的最小ASCII删除和open in new window
🟠
-
剑指 Offer II 095. 最长公共子序列open in new window
🟠
不知道大家做算法题有什么感觉,我总结出来做算法题的技巧就是,把大的问题细化到一个点,先研究在这个小的点上如何解决问题,然后再通过递归/迭代的方式扩展到整个问题。
比如说我们前文 ...
经典动态规划:高楼扔鸡蛋读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
887. Super Egg Dropopen in new window
887. 鸡蛋掉落open in new window
🔴
本文要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼。国内大厂以及谷歌脸书面试都经常考察这道题,只不过他们觉得扔鸡蛋太浪费,改成扔杯子,扔破碗什么的。
具体的问题等会再说,但是这道题的解法技巧很多,光动态规划就好几种效率不同的思路,最后还有一种极其高效数学解法。秉承本书一贯的作风,拒绝过于诡异的技巧,因为这些技巧无法举一反三,学了也不划算。
下面就来用我们一直强调的动态规划通用思路来研究一下这道题。
#一、解析题目这是力扣第 887 题「鸡蛋掉落open in new window」,我描述一下题目:
你面前有一栋从 1 到 N 共 N 层的楼,然后给你 K 个鸡蛋(K 至少为 1)。现在确定这栋楼存在楼层 0 <= F <= N,在这层楼将鸡蛋扔下去,鸡蛋恰好没 ...
目标和:背包问题的变体读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
494. Target Sumopen in new window
494. 目标和open in new window
🟠
-
剑指 Offer II 102. 加减的目标值open in new window
🟠
我们前文经常说回溯算法和递归算法有点类似,有的问题如果实在想不出状态转移方程,尝试用回溯算法暴力解决也是一个聪明的策略,总比写不出来解法强。
那么,回溯算法和动态规划到底是啥关系?它俩都涉及递归,算法模板看起来还挺像的,都涉及做「选择」,真的酷似父与子。
那么,它俩具体有啥区别呢?回溯算法和动态规划之间,是否可能互相转化呢?
今天就用力扣第 494 题「目标和open in new window」来详细对比一下回溯算法和动态规划,题目如下:
给你输入一个非负整数数组 nums 和一个目标值 target,现在你可以给每一个元素 nums[i] 添加正号 + 或负号 -,请你计算有几种符号的组合能够使得 nums 中元素的和为 target ...
剪视频剪出一个贪心算法读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
1024. Video Stitchingopen in new window
1024. 视频拼接open in new window
🟠
前面发过几个视频,也算是对视频剪辑入了个门。像我这种非专业剪辑玩家,不做什么宏大特效电影镜头,只是做个视频教程,其实也没啥难度,只需要把视频剪流畅,所以用到最多的功能就是切割功能,然后删除和拼接视频片接。
没有剪过视频的读者可能不知道,在常用的剪辑软件中视频被切割成若干片段之后,每个片段都可以还原成原始视频。
就比如一个 10 秒的视频,在中间切一刀剪成两个 5 秒的视频,这两个五秒的视频各自都可以还原成 10 秒的原视频。就好像蚯蚓,把自己切成 4 段就能搓麻,把自己切成 11 段就可以凑一个足球队。
剪视频时,每个视频片段都可以抽象成了一个个区间,时间就是区间的端点,这些区间有的相交,有的不相交……
假设剪辑软件不支持将视频片段还原成原视频,那么如果给我若干视频片段,我怎么将它们还原成原视频呢?
🌟
🌟
这是 ...
如何运用贪心思想玩跳跃游戏读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
45. Jump Game IIopen in new window
45. 跳跃游戏 IIopen in new window
🟠
55. Jump Gameopen in new window
55. 跳跃游戏open in new window
🟠
经常有读者在后台问,动态规划和贪心算法到底有啥关系。我们之前的文章 贪心算法之区间调度问题 就说过一个常见的时间区间调度的贪心算法问题。
说白了,贪心算法可以理解为一种特殊的动态规划问题,拥有一些更特殊的性质,可以进一步降低动态规划算法的时间复杂度。那么这篇文章,就讲 LeetCode 上两道经典的贪心算法:跳跃游戏 I 和跳跃游戏 II。
我们可以对这两道题分别使用动态规划算法和贪心算法进行求解,通过实践,你就能更深刻地理解贪心和动规的区别和联系了。
🌟
🌟
#Jump Game I这是力扣第 55 题「跳跃游戏open in new window」,难度是中等,但实际上比较简单,看题目:
...
扫描线技巧:安排会议室读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
253. Meeting Rooms IIopen in new window🔒
253. 会议室 IIopen in new window🔒
🟠
之前面试,被问到一道非常经典且非常实用的算法题目:会议室安排问题。
力扣上类似的问题是会员题目,你可能没办法做,但对于这种经典的算法题,掌握思路还是必要的。
先说下题目,力扣第 253 题「会议室 IIopen in new window」:
给你输入若干形如 [begin, end] 的区间,代表若干会议的开始时间和结束时间,请你计算至少需要申请多少间会议室。
函数签名如下:
java 🟢cpp 🤖python 🤖go 🤖javascript 🤖
// 返回需要申请的会议室数量int minMeetingRooms(int[][] meetings);
比如给你输入 meetings = [[0,30],[5,10],[15,20]],算法应该返回 2,因为后两个会议和第一个会议时间是冲突的,至少 ...
贪心算法之区间调度问题读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
435. Non-overlapping Intervalsopen in new window
435. 无重叠区间open in new window
🟠
452. Minimum Number of Arrows to Burst Balloonsopen in new window
452. 用最少数量的箭引爆气球open in new window
🟠
什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高。
比如说一个算法问题使用暴力解法需要指数级时间,如果能使用动态规划消除重叠子问题,就可以降到多项式级别的时间,如果满足贪心选择性质,那么可以进一步降低时间复杂度,达到线性级别的。
什么是贪心选择性质呢,简单说就是:每一步都做出一个局部最优的选择,最终的结果就是全局最优。注意哦,这是一种特殊性质,其实只有一部分问题拥有这个性质。
比如你面前放着 100 ...
Git使用Git是目前世界上最先进的分布式版本控制系统。
工作原理 / 流程
Git下载与安装具体安装教程已有详细博客,不多说,上链接
[Git下载与安装_pingcode的博客-CSDN博客_git](https://blog.csdn.net/qq_41521682/article/details/122764915#:~:text=第一步 下载git (找到自己需要的版本) 第二步 下载 完点击 安装 包进入使用许可声明界面,这里我是选择装在D盘,大家如果嫌麻烦就默认 安装 在C盘 第四步 点击Next进入选择 安装 组件界面 上图红框内的选项是默认勾选的,建议不要动。)
Git初始配置
安装完成后,需要对软件进行配置,右键点Git Bash Here, 输入以下指令
git config --global user.name "你的用户名"git config --global user.email "你的邮箱"
解释一下,用户名和邮箱起标识作用,git命令行和Linux指令很相似,--后面加完整名称的单词做 ...
加密安全Base64编码将二进制字节转化为文本格式
将任意二进制字节数据转化为只包含 AZ az 0~`9 + / =` 这64个字符
原理是将3个字节的二进制数据按照6bit一组, 用4个int整数表示, 然后将int整数用索引对应到字符, 得到编码后的字符串
3个byte数据分别是e4、b8、ad,按6bit分组得到39、0b、22和2d:
┌───────────────┬───────────────┬───────────────┐│ e4 │ b8 │ ad │└───────────────┴───────────────┴───────────────┘┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐│1│1│1│0│0│1│0│0│1│0│1│1│1│0│0│0│1│0│1│0│1│1│0│1│└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘┌─────── ...
Java APIStream流流收集合//流转化为集合Stream<String> stream = Stream.of("A", "B", "C");stream.collect(Collectors.toList())stream.collect(Collectors.toSet())stream.collect(Collectors.toCollection(ArraysList::new))//流转化为数组stream.toArray()stream.toArray(int[]::new)//聚合计算stream.collect(Collectors.maxBy())stream.collect(Collectors.minBy())stream.collect(Collectors.counting())stream.collect(Collectors.summingInt())stream.collect(Collectors.averagingInt())//分组 分组函数 值收集器默认为Lis ...