TypechoJoeTheme

Toasobi的博客

搜索到 19 篇与 的结果 ———
2023-09-22

钥匙和房间(图的dfs与bfs)

钥匙和房间(图的dfs与bfs)
题目:有 n 个房间,房间按从 0 到 n - 1 编号。最初,除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。给你一个数组 rooms 其中 rooms[i] 是你进入 i 号房间可以获得的钥匙集合。如果能进入 所有 房间返回 true,否则返回 false。示例 1:输入:rooms = [[1],[2],[3],[]]输出:true解释:我们从 0 号房间开始,拿到钥匙 1。之后我们去 1 号房间,拿到钥匙 2。然后我们去 2 号房间,拿到钥匙 3。最后我们去了 3 号房间。由于我们能够进入每个房间,我们返回 true。示例 2:输入:rooms = [[1,3],[3,0,1],[2],[0]]输出:false解释:我们不能进入 2 号房间。此题考察图的遍历当 xxx 号房间中有 yyy 号房间的钥匙时,我们就可以从 xxx 号房间去往 yyy 号房间。如果我们将这 n...
2023-09-22

经典例题

0 阅读
0 评论
2023年09月22日
0 阅读
0 评论
2023-09-21

行星碰撞(栈模拟)

行星碰撞(栈模拟)
题目给定一个整数数组 asteroids,表示在同一行的小行星。对于数组中的每一个元素,其绝对值表示小行星的大小,正负表示小行星的移动方向(正表示向右移动,负表示向左移动)。每一颗小行星以相同的速度移动。找出碰撞后剩下的所有小行星。碰撞规则:两个小行星相互碰撞,较小的小行星会爆炸。如果两颗小行星大小相同,则两颗小行星都会爆炸。两颗移动方向相同的小行星,永远不会发生碰撞。示例 1:输入:asteroids = [5,10,-5]输出:[5,10]解释:10 和 -5 碰撞后只剩下 10 。 5 和 10 永远不会发生碰撞。示例 2:输入:asteroids = [8,-8]输出:[]解释:8 和 -8 碰撞后,两者都发生爆炸。示例 3:输入:asteroids = [10,2,-5]输出:[10]解释:2 和 -5 发生碰撞后剩下 -5 。10 和 -5 发生碰撞后剩下 10 。为了方便,我们令 asteroids 为 ats。由于碰撞抵消总是从相邻行星之间发生,我们可以使用「栈」来模拟该过程。从前往后处理所有的 ats[i]ats[i]ats[i],使用栈存储当前未被抵消的行星,...
2023-09-21

经典例题

0 阅读
0 评论
2023年09月21日
0 阅读
0 评论
2023-09-20

路径之和|||(dfs,前缀和,回溯)

路径之和|||(dfs,前缀和,回溯)
题目给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。示例 1:输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8输出:3解释:和等于 8 的路径有 3 条,如图所示。示例 2:输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22输出:3两次深度优先搜索一次dfs是只能从一个头结点往下搜索符合情况,但是这道题路径不需要从根节点开始,也不需要在叶子节点结束,可以考虑使用两次dfs两次dfs无非就是让每个节点都当一次头结点,然后以他们为根向下搜索可行情况,但是时间复杂度也会上升到O(N2)代码如下:class Solution { public int pathSum(TreeNode root, int targetSum) { if (...
2023-09-20

经典例题

0 阅读
0 评论
2023年09月20日
0 阅读
0 评论
2023-09-19

无重复区间(贪心)

无重复区间(贪心)
题目:给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 。示例 1:输入: intervals = [[1,2],[2,3],[3,4],[1,3]]输出: 1解释: 移除 [1,3] 后,剩下的区间没有重叠。示例 2:输入: intervals = [ [1,2], [1,2], [1,2] ]输出: 2解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。示例 3:输入: intervals = [ [1,2], [2,3] ]输出: 0解释: 你不需要移除任何区间,因为它们已经是无重叠的了。解题关键:1.如何判断两个区间是否重合 2.如何去重使得留下的区间最多解题思路:为了让留下的区间最多,首先需要排序,使得所有区间有区分度,重合更少。(作为区间题,或者是一些贪心题,排序总是会有大用处)我们可以使用左区间排序(右区间也可以,这道题的下面的题解用的是左排序)先排序区间,然后进行比较 如何比较? 因为我们使用的是左排序,所以可以通过比较下一个区间的左区间与这一个区...
2023-09-19

经典例题

0 阅读
0 评论
2023年09月19日
0 阅读
0 评论
2023-09-18

K 和数对的最大数目(两数之和进阶)

K 和数对的最大数目(两数之和进阶)
**题目:**给你一个整数数组 nums 和一个整数 k 。每一步操作中,你需要从数组中选出和为 k 的两个整数,并将它们移出数组。返回你可以对数组执行的最大操作数。示例 1:输入:nums = [1,2,3,4], k = 5输出:2解释:开始时 nums = [1,2,3,4]:移出 1 和 4 ,之后 nums = [2,3]移出 2 和 3 ,之后 nums = []不再有和为 5 的数对,因此最多执行 2 次操作。示例 2:输入:nums = [3,1,3,4,3], k = 6输出:1解释:开始时 nums = [3,1,3,4,3]:移出前两个 3 ,之后nums = [1,4,3]不再有和为 6 的数对,因此最多执行 1 次操作。解法一:哈希表这个解法是我根据之前做过的两数之和的题解拓展之后写出的,但是放在这道题上,由于其过多的操作导致其时间和空间效率都很低,因此不推荐class Solution { public int maxOperations(int[] nums, int k) { int length = nums.length;...
2023-09-18

经典例题

0 阅读
0 评论
2023年09月18日
0 阅读
0 评论