如何运用贪心思想玩跳跃游戏读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
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 ...
如何同时寻找缺失和重复的元素读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
645. Set Mismatchopen in new window
645. 错误的集合open in new window
🟢
今天就聊一道很看起来简单却十分巧妙的问题,寻找缺失和重复的元素。之前的一篇文章 常用的位操作 中也写过类似的问题,不过这次的和上次的问题使用的技巧不同。
这是力扣第 645 题「错误的集合open in new window」,我来描述一下这个题目:
给一个长度为 N 的数组 nums,其中本来装着 [1..N] 这 N 个元素,无序。但是现在出现了一些错误,nums 中的一个元素出现了重复,也就同时导致了另一个元素的缺失。请你写一个算法,找到 nums 中的重复元素和缺失元素的值。
java 🟢cpp 🤖python 🤖go 🤖javascript 🤖
// 返回两个数字,分别是 {dup, missing}int[] findErrorNums(int[] nums);
比如说输入:nu ...
讲两道常考的阶乘算法题读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
172. Factorial Trailing Zeroesopen in new window
172. 阶乘后的零open in new window
🟠
793. Preimage Size of Factorial Zeroes Functionopen in new window
793. 阶乘函数后 K 个零open in new window
🔴
笔试题中经常看到阶乘相关的题目,今天说两个最常见的题目:
1、输入一个非负整数 n,请你计算阶乘 n! 的结果末尾有几个 0。
这也是力扣第 172 题「阶乘后的零open in new window」,比如说输入 n = 5,算法返回 1,因为 5! = 120,末尾有一个 0。
函数签名如下:
int trailingZeroes(int n);
2、输入一个非负整数 K,请你计算有多少个 n,满足 n! 的结果末尾恰好有 K 个 0。
这也是力扣第 793 题「阶乘后 K 个零open i ...
谈谈游戏中的随机算法读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
382. Linked List Random Nodeopen in new window
382. 链表随机节点open in new window
🟠
384. Shuffle an Arrayopen in new window
384. 打乱数组open in new window
🟠
398. Random Pick Indexopen in new window
398. 随机数索引open in new window
🟠
没事儿的时候我喜欢玩玩那些经典的 2D 网页小游戏,我发现很多游戏都要涉及地图的随机生成,比如扫雷游戏中雷的位置应该是随机分布的:
再比如经典炸弹人游戏,障碍物的位置也是有一定随机性的:
这些 2D 游戏相较现在的大型 3D 游戏虽然看起来有些简陋,但依然用到很多有趣算法技巧,本文就来深入研究一下地图的随机生成算法。
2D 游戏的地图肯定可以抽象成一个二维矩阵,就拿扫雷举例吧,我们可以用下面这个类表示扫雷的棋盘: ...
如何高效进行模幂运算读完本文,你不仅学会了算法套路,还可以顺便解决如下题目:
LeetCode
力扣
难度
372. Super Powopen in new window
372. 超级次方open in new window
🟠
今天来聊一道与数学运算有关的题目,力扣第 372 题「超级次方open in new window」,让你进行巨大的幂运算,然后求余数。
java 🤖cpp 🟢python 🤖go 🤖javascript 🤖
// 注意:java 代码由 chatGPT🤖 根据我的 cpp 代码翻译,旨在帮助不同背景的读者理解算法逻辑。// 本代码不保证正确性,仅供参考。如有疑惑,可以参照我写的 cpp 代码对比查看。int superPow(int a, List<Integer> b);
要求你的算法返回幂运算 a^b 的计算结果与 1337 取模(mod,也就是余数)后的结果。就是你先得计算幂 a^b,但是这个 b 会非常大,所以 b 是用数组的形式表示的。
这个算法其实就是广泛应用于离散数学的模幂算法,至于为什么要对 1 ...
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指令很相似,--后面加完整名称的单词做 ...
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 ...
加密安全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│└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘┌─────── ...