面试高频题 力扣 417. 太平洋大西洋水流问题 洪水灌溉(FloodFill) 深度优先遍历(dfs) 暴力搜索 C++解题思路 每日一题

目录

  • 零、题目描述:用人话再讲一遍
  • 一、为什么这道题值得咱们学习?
  • 二、思路探索
    • 常规思路:逐个检查每个格子(会超时!⚠️)
  • 三、正难则反:反向思维的巧妙应用 🔄
  • (思考时间!)💡
  • 四、代码实现:一步步拆解
    • 代码拆解:
    • 时间复杂度分析
    • 空间复杂度分析
  • 六、坑点总结 & 举一反三 🚀

嗨,各位算法爱好者!今天咱们来讨论一道有点绕但超经典的题目—— LeetCode 417. 太平洋大西洋水流问题。这道题堪称“洪水灌溉”系列的进阶版,学好它,能让你的逆向思维能力上个大台阶!

零、题目描述:用人话再讲一遍

在这里插入图片描述

这道题力扣上面的题目表述太难评了,本来挺简单的一道题让力扣的描述说的好像一道外星题,我就不过多说明力扣的题目描述,用我自己的话来向大家解释下这道题:

题目核心
给你一个 m x n 的网格(可以想象成一个岛屿的地形图)

  • 每个坐标都有自己的高度值 🏔️
  • 岛屿的上边界左边界挨着 太平洋 🌊
  • 岛屿的下边界右边界挨着 大西洋 🌊
  • 水往低处流或者平流(即水可以向<=自己高度值的坐标里流动
  • 这道题要我们返回的就是既能流到太平洋,又能流到大西洋的格子坐标。

举个栗子 🌰:
如果一个格子的水,既能一路向左/向上流到太平洋,又能一路向右/向下流到大西洋,那它就是我们要找的目标!

我们用示例1来说明:👇

在这里插入图片描述输入: heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]]
输出: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]]

以坐标 [2,2](第三行第三列,高度 5 )为例,快速模拟验证逻辑:

我们来以 [2,2]也就就是图中最中间的5这个坐标模拟流水

先是流向太平洋
[2,2] (5)[1,2] (3)(上,3≤5)→ [0,2] (2)(上,2≤3)→ 触达第 0 行(太平洋边界)

之后是流大西洋
[2,2] (5)[3,2] (1)(下,1≤5)→ [4,2] (1)(下,1≤1)→ 触达第 4 行(大西洋边界)

这些黄色格子要么本身就在海洋边界(直接满足流向对应海洋),要么能通过 “向更低 / 等高单元格流动” 的规则,连通到太平洋或大西洋的边界 。通过这样的水流逻辑,它们被判定为 “既能流向太平洋,又能流向大西洋”,所以出现在最终结果里。你可以结合网格图,顺着水流方向模拟一遍,就能更直观理解啦~

一、为什么这道题值得咱们学习?

这道题简直是逆向思维的绝佳教材!它的精髓在于:

  • 打破“从起点找终点”的固定思维,学会“正难则反”(当正面求解复杂时,试试反过来想)
  • 进一步巩固洪水灌溉(Flood Fill) 算法的应用
  • 训练二维网格中“区域标记”与“交集计算”的能力

💡 悄悄说:这道题和咱们专栏中的第一篇博客力扣 200.岛屿数量是递进关系哦!如果还没看过建议先去看一看那一篇博客,讲了DFS的基础实现,我们专栏中的上一篇博客力扣 130. 被围绕的区域则铺垫了“正难则反”的思路,循序渐进效果更佳~感兴趣的朋友可以订阅我的专栏每日一题,我会每天发一篇关于算法练习的博客哦,专栏中的博客也都是有着层层递进的联系的~

二、思路探索

常规思路:逐个检查每个格子(会超时!⚠️)

最直观的想法:遍历每个格子,分别判断它能否流到太平洋和大西洋。

步骤:

  1. 对每个格子 (i,j),调用 canFlowToPacific(i,j)canFlowToAtlantic(i,j)
  2. 两个函数都返回 true 时,加入结果集

实现草图

// 检查(i,j)能否流到太平洋
bool canFlowToPacific(int i, int j, vector<vector<int>>& heights) {if (i == 0 || j == 0) return true; // 已到达太平洋边界for (四个方向) {int ni = i + dx[k], nj = j + dy[k];if ( heights[ni][nj] <= heights[i][j] ) { // 能往低处流if (canFlowToPacific(ni, nj, heights)) return true;}}return false;
}
// 大西洋同理...

为什么会超时?

  • 每个格子可能被重复检查多次,时间复杂度高达 O((m*n)^2)
  • 对于 300x300 的网格,运算量会达到惊人的 8100 万²,直接爆掉!

结果也是如此,我已经替大家试过了/(ㄒoㄒ)/~~
在这里插入图片描述
所以说我们要换一个思路👇

三、正难则反:反向思维的巧妙应用 🔄

既然从格子往海洋流不好算,那咱们反过来想:从海洋往陆地“爬”

核心逻辑:

  1. 太平洋的范围:从所有能直接流入太平洋的边界(上边界 i=0、左边界 j=0)出发,标记所有能逆流到达的格子(即这些格子的水可以流到太平洋)。
  2. 大西洋的范围:从所有能直接流入大西洋的边界(下边界 i=rows-1、右边界 j=cols-1)出发,标记所有能逆流到达的格子(即这些格子的水可以流到大西洋)。
  3. 结果:要是我们遍历完这两个范围那么两个范围的重叠区域,就是既能流到太平洋又能流到大西洋的格子!

生动比喻 🌊➡️🏔️:
想象太平洋和大西洋的水在涨潮,水可以往高处漫(和自然规律相反,这里是“逆水行舟”)。最终,被两边的水都淹没的地方,就是我们要找的答案~

步骤拆解:

  • 第一步:用 Pmark 数组标记太平洋能“淹到”的格子
    • (0,j)(上边界)和 (i,0)(左边界)开始DFS
    • 只有当相邻格子更高或等高时,水才能漫过去
  • 第二步:用 Amark 数组标记大西洋能“淹到”的格子
    • (rows-1,j)(下边界)和 (i,cols-1)(右边界)开始DFS
  • 第三步:遍历所有格子,同时被 PmarkAmark 标记的就是结果

(思考时间!)💡

理解了“正难则反”的思路后,不妨先自己动手试试写代码?

  • 如何初始化两个标记数组?
  • DFS的递归条件应该怎么写?
  • 如何高效求两个标记数组的交集?

先尝试独立实现,再看下面的代码解析,收获会更大哦~

四、代码实现:一步步拆解

class Solution {
public:// 方向数组:上下左右(顺序不影响,覆盖四个方向即可)int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};int rows, cols; // 网格的行数和列数vector<vector<int>> result; // 存储最终结果vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {// 边界检查:空网格直接返回if (heights.empty() || heights[0].empty()) return result;rows = heights.size();cols = heights[0].size();// 初始化标记数组:记录能流到两个海洋的格子vector<vector<bool>> Pmark(rows, vector<bool>(cols, false)); // 太平洋vector<vector<bool>> Amark(rows, vector<bool>(cols, false)); // 大西洋// 1. 标记太平洋的范围// 左边界(j=0)的所有格子for(int i = 0; i < rows; i++) {dfs(i, 0, heights, Pmark);}// 上边界(i=0)的所有格子(注意:(0,0)已经被左边界处理过,这里会重复调用但不影响)for(int j = 0; j < cols; j++) {dfs(0, j, heights, Pmark);}// 2. 标记大西洋的范围// 右边界(j=cols-1)的所有格子for(int i = 0; i < rows; i++) {dfs(i, cols-1, heights, Amark);}// 下边界(i=rows-1)的所有格子for(int j = 0; j < cols; j++) {dfs(rows-1, j, heights, Amark);}// 3. 找两个范围的交集for(int i = 0; i < rows; i++) {for(int j = 0; j < cols; j++) {if(Pmark[i][j] && Amark[i][j]) {result.push_back({i, j});}}}return result;}// DFS函数:从(x,y)出发,标记所有能被当前海洋"淹没"的格子void dfs(int x, int y, vector<vector<int>>& heights, vector<vector<bool>>& mark) {// 1. 如果已经标记过,直接返回(避免重复递归)if (mark[x][y]) return;// 2. 标记当前格子为可到达mark[x][y] = true;// 3. 遍历四个方向,检查能否逆流而上(往高处漫)for(int i = 0; i < 4; i++) {int nx = x + dx[i]; // 新行坐标int ny = y + dy[i]; // 新列坐标// 边界检查:新坐标必须在网格内if(nx >= 0 && ny >= 0 && nx < rows && ny < cols) {// 核心条件:相邻格子比当前高或相等,且未被标记if (!mark[nx][ny] && heights[nx][ny] >= heights[x][y]) {dfs(nx, ny, heights, mark);}}}}
};

代码细节解释:

  1. 方向数组dxdy 定义了上下左右四个方向,避免手写四次重复代码。

  2. 标记数组

    • Pmark[i][j] = true 表示 (i,j) 的水可以流到太平洋
    • Amark[i][j] = true 表示 (i,j) 的水可以流到大西洋
  3. DFS 触发时机

    • 太平洋从 上边界(i=0)左边界(j=0) 开始
    • 大西洋从 下边界(i=rows-1)右边界(j=cols-1) 开始
    • 重复触发(如 (0,0) 被两个边界触发)不影响,因为 mark[x][y] 会过滤重复
  4. DFS 核心逻辑

    • 先标记当前格子为“可到达”
    • 对四个方向的邻居,只有当 邻居更高或等高未被标记 时,才递归深入
    • 这模拟了“水往高处漫”的逆向过程
  5. 结果收集:两个标记数组都为 true 的格子,就是既能流到太平洋又能流到大西洋的目标。

代码拆解:

1. 类中成员变量解析

class Solution {
public:// 方向数组:上下左右四个方向的坐标偏移,避免重复写坐标计算int dx[4] = {1, -1, 0, 0};  int dy[4] = {0, 0, 1, -1};  int rows, cols;  // 存储网格的行数、列数,dfs 中直接复用vector<vector<int>> result;  // 最终结果:同时流向两大洋的坐标
};

作用

  • 把重复用的变量(方向、网格尺寸)设为类成员,减少函数传参,让代码更简洁。
  • result 集中存结果,避免分散处理。

2. 主函数核心逻辑

vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {// 边界防护:空网格直接返回if (heights.empty() || heights[0].empty()) return result;  rows = heights.size();  cols = heights[0].size();  // 标记数组:记录能流向太平洋、大西洋的格子vector<vector<bool>> Pmark(rows, vector<bool>(cols, false));  vector<vector<bool>> Amark(rows, vector<bool>(cols, false));  // 1. 从太平洋边界启动 DFS(上边界 + 左边界)for (int i = 0; i < rows; i++) dfs(i, 0, heights, Pmark);   // 左边界for (int j = 0; j < cols; j++) dfs(0, j, heights, Pmark);   // 上边界  // 2. 从大西洋边界启动 DFS(下边界 + 右边界)for (int i = 0; i < rows; i++) dfs(i, cols-1, heights, Amark); // 右边界for (int j = 0; j < cols; j++) dfs(rows-1, j, heights, Amark); // 下边界  // 3. 找交集:同时被两个海洋标记的格子for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (Pmark[i][j] && Amark[i][j]) {result.push_back({i, j});  }}}return result;
}

核心步骤

  • 边界防护:先判空,避免后续越界访问。
  • 标记数组Pmark 记能流太平洋的格子,Amark 记能流大西洋的格子。
  • 逆向 DFS:从海洋边界(太平洋上/左、大西洋下/右)往陆地 “逆流”,标记所有能连通的格子。
  • 找交集:同时被 PmarkAmark 标记的格子,就是答案。

3. DFS 函数核心逻辑

void dfs(int x, int y, vector<vector<int>>& heights, vector<vector<bool>>& mark) {// 已标记过就跳过,避免重复递归if (mark[x][y]) return;  mark[x][y] = true;  // 标记当前格子为“可流向对应海洋”// 遍历四个方向for (int i = 0; i < 4; i++) {  int nx = x + dx[i];  // 新行坐标int ny = y + dy[i];  // 新列坐标// 检查:新坐标合法 + 未标记 + 高度 >= 当前(逆流条件)if (nx >= 0 && ny >= 0 && nx < rows && ny < cols && !mark[nx][ny] && heights[nx][ny] >= heights[x][y]) {dfs(nx, ny, heights, mark);  // 递归标记相邻格子}}
}

核心设计

  • 标记优先:进入 DFS 先标记当前格子,避免重复处理。
  • 逆流逻辑:只有相邻格子高度 >= 当前(模拟 “水往高处漫”),才递归(和自然水流相反,是逆向思维关键)。
  • 边界检查nxny 要在网格内,否则跳过。

4. 局部递归示例(以太平洋左边界 (0,0) 为例)
假设网格如下(简化示意,仅看关键流程):

heights = [[1, 2, 3],[4, 5, 6],[7, 8, 9]
]

触发 dfs(0, 0, heights, Pmark)(太平洋左边界起点),递归过程:

  1. 第一步dfs(0,0)

    • 标记 Pmark[0][0] = true
    • 检查四个方向:
      • 下(dx[0]=1):nx=1, ny=0 → 高度 4 >= 1 → 递归 dfs(1,0)
      • 上、左:越界或已处理,跳过
      • 右:需等待 dfs(1,0) 及其所有递归分支执行完毕并回溯后,才会处理 (0,1)。
  2. 第二步dfs(1,0)

    • 标记 Pmark[1][0] = true
    • 检查四个方向:
      • 下(nx=2, ny=0):高度 7 >= 4 → 递归 dfs(2,0)
      • 上(nx=0, ny=0):已标记,跳过
      • 右(nx=1, ny=1):高度 5 >= 4 → 递归 dfs(1,1)
      • 左:越界,跳过
  3. 第三步dfs(2,0)dfs(1,1) 继续扩散…

    • 最终,所有能从 (0,0) 逆流到达的格子都会被标记为 Pmark = true,模拟 “太平洋的水往陆地漫” 的过程。

递归特点:像 “逆向洪水”,从海洋边界出发,逐步标记所有能连通的陆地,直到无法再逆流为止。

总结
代码通过 逆向 DFS(从海洋往陆地流) + 双标记数组(太平洋/大西洋) + 交集筛选,高效解决了 “判断水流双向连通” 的问题。类成员变量简化了传参,DFS 递归实现了 “逆流标记”,主函数通过边界遍历 + 交集计算,最终得到结果。

结合示例模拟递归流程,能更直观理解 “逆向思维 + 洪水灌溉” 的巧妙用法~

时间复杂度分析

  • 核心逻辑:算法通过两次独立的 DFS 遍历(分别对应太平洋和大西洋)标记所有可达格子,最终计算交集。
  • 具体计算
    • 网格共有 m*n 个格子(m 为行数,n 为列数)。
    • 每个格子最多被 2 次 DFS 访问(太平洋遍历一次,大西洋遍历一次)。
    • 每次 DFS 中,每个格子的处理(检查方向、标记)是常数时间 O(1)
  • 结论:总时间复杂度为 O(m*n),与网格规模线性相关,效率高效。

空间复杂度分析

  • 核心消耗:主要来自两部分——递归调用栈和标记数组。
  • 具体计算
    • 标记数组PmarkAmark 各占用 m*n 空间,合计 O(m*n)
    • 递归栈:最坏情况下(如网格是递增序列,DFS 需遍历所有格子),递归深度可达 m*n(例如从边界一直递归到对角),占用 O(m*n) 空间。
  • 结论:总空间复杂度为 O(m*n),由标记数组和递归栈共同决定。

对比之前的思路,效率提升了不止一个量级!这就是逆向思维的魅力~

六、坑点总结 & 举一反三 🚀

  1. 边界条件:DFS 时要严格检查 nxny 是否在网格内,否则会数组越界。
  2. 递归终止if (mark[x][y]) return 是关键,避免重复递归导致栈溢出。
  3. 逆流条件:必须是 heights[nx][ny] >= heights[x][y],漏了“等于”会出错。

掌握这一系列,你对“洪水灌溉”和“DFS 标记”的理解会突飞猛进!

明天咱们要讲的题是力扣 529.扫雷游戏感兴趣的朋友可以提前去看一看

最后欢迎大家在评论区分享你的代码或思路,咱们一起交流探讨~ 🌟 要是有大佬有更精妙的思路或想法,恳请在评论区多多指点批评,我一定会虚心学习,并且第一时间回复交流哒!
在这里插入图片描述
这是封面原图~ 喜欢的话先点个赞鼓励一下呗~ 再顺手关注一波,后续更新不迷路,保证让你看得过瘾!😉

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90306.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

博物馆智慧导览系统AR交互与自动感应技术:从虚实融合到智能讲解的技术实践

本文面向博物馆信息化开发者、智慧场馆系统技术建设师及AR 设计工程师,从AR 交互与自动感应技术的逻辑出发,拆解AR虚实融合技术与智能讲解自动感应技术的原理&#xff0c;为相关开发者实践提供可复用的技术路径。如需获取博物馆智慧导览系统解决方案请前往文章最下方获取&#…

高效编程革命:DeepSeek V3多语言支持与性能优化实战

文章目录 如何利用DeepSeek V3编写高效程序代码:从原理到实践 引言 一、DeepSeek V3核心能力解析 1.1 模型架构与优势 1.2 与传统编程辅助工具对比 二、高效代码编写实践指南 2.1 精准提示工程(Prompt Engineering) 基础提示模板 高级提示技巧 2.2 生产级代码生成案例 示例:…

OkHttp 与 JSON 解析库完美结合:Moshi/Jackson/Gson 实战指南

前言在现代 Android 开发中&#xff0c;网络请求与 JSON 数据处理是密不可分的。OkHttp 作为强大的 HTTP 客户端&#xff0c;与 JSON 解析库&#xff08;Moshi/Jackson/Gson&#xff09;的结合使用&#xff0c;可以极大简化网络请求与数据解析的流程。本文将详细介绍如何将 OkH…

An error occurred at line: 1 in the generated java file问题处理及tomcat指定对应的jdk运行

一、背景 tomcat7启动后&#xff0c;加载jsp页面报错&#xff0c;提示无法将jsp编译为class文件&#xff0c;主要报错信息如下&#xff1a; An error occurred at line: 1 in the generated java file 最后确认该错误原因为&#xff1a;tomcat7不支持jdk1.8版本 机器上已配…

深入剖析大模型在文本生成式 AI 产品架构中的核心地位

一、大模型的崛起与概念解析 在人工智能技术飞速迭代的当下&#xff0c;大模型已成为驱动行业发展的核心引擎。从技术定义来看&#xff0c;大模型&#xff08;Large Model&#xff09; 是指基于深度学习架构、具备海量参数规模&#xff08;通常数十亿至数万亿级别&#xff09;&…

Vue Scoped样式:当动态元素成为“无家可归“的孤儿

引言&#xff1a;一场CSS的"身份危机"想象一下&#xff1a;你精心设计了一个Vue组件&#xff0c;为每个元素添加了漂亮的样式。你满意地添加了scoped属性&#xff0c;确保样式不会"越狱"影响其他组件。然后你动态添加了一些新元素&#xff0c;却发现它们完…

vmware分配了ubuntu空间但是ubuntu没有获取

一开始我看vmware中的ubuntu磁盘空间只有200g不够用&#xff0c;我在vmware给Ubuntu分了300G的磁盘空间&#xff0c;但是ubuntu还是只有之前的200g 如图在ubuntu查看后来发现&#xff0c;在磁盘软件里面需要自己分配磁盘空间大小拓展后就可以了

[MarkdownGithub] 使用块引用高亮显示“注意“和“警告“和其他注意方式的选项

参考来源: https://github.com/orgs/community/discussions/16925 Alerts are an extension of Markdown used to emphasize critical information. On GitHub, they are displayed with distinctive colors and icons to indicate the importance of the content. 提示框是 Ma…

mac测试ollama llamaindex

LlamaIndexs 将大语言模型和外部数据连接在一起的工具。大模型prompt有一个长度限制&#xff0c;当外部知识的内容超过这个长度&#xff0c;无法同时将有效信息传递给大模型&#xff0c;因此就诞生了 LlamaIndex。 具体操作就是通过多轮对话的方式不断提纯外部数据&#xff0c…

数据结构:字符串:大小写转换(changing case of a string)

目录 第一性问题&#xff1a;什么是“大小写”&#xff1f; 逐步构造代码&#xff1a;全部转为大写 我们现在用 第一性原理 的方式&#xff0c;从字符串与字符的本质出发&#xff0c;一步步推导出如何在 C 语言中将字符串中的字母变成全部大写或全部小写。 第一性问题&…

闲庭信步使用图像验证平台加速FPGA的开发:第三十二课——车牌识别的FPGA实现(4)车牌字符的分割定位

&#xff08;本系列只需要modelsim即可完成数字图像的处理&#xff0c;每个工程都搭建了全自动化的仿真环境&#xff0c;只需要双击top_tb.bat文件就可以完成整个的仿真&#xff0c;大大降低了初学者的门槛&#xff01;&#xff01;&#xff01;&#xff01;如需要该系列的工程…

03_java_运行机制

1. java执行流程2. 什么是编译3. 什么是运行

鸿蒙卡片开发保姆级教程

卡片 1. 卡片概念 什么是卡片&#xff1f;卡片用来显示或者提示一些基本信息或者进行一些基本操作。注意不能做重逻辑&#xff0c;所有重要逻辑全部交给应用如果是元服务如何唤醒&#xff1f;因为元服务不提供桌面应用图标&#xff0c;我们可以通过用户手动的方式在桌面上添加一…

反向传播及优化器

反向传播&#xff08;Backpropagation&#xff09;反向传播是计算梯度的算法&#xff0c;核心作用是高效求解 “损失函数对模型所有参数的偏导数”&#xff08;即梯度&#xff09;。没有反向传播&#xff0c;深度学习的大规模训练几乎不可能实现。 整个过程像 “从终点回溯到起…

【机器学习深度学习】生成式模型的评估与验证

目录 前言 1. 主观评估&#xff1a;以人为本的质量判断 1.1 什么是主观评估&#xff1f; 1.2 主观评估的核心流程 1.3 主观评估的优缺点 2. 客观评估&#xff1a;量化的性能衡量 2.1 什么是客观评估&#xff1f; 2.2 常见的客观评估指标 文本生成 图像生成 多模态生…

Linux文件——Ext2文件系统(3)_软硬链接

文章目录文件的软硬链接软链接硬链接软硬链接对比软硬链接应用软硬链接注意事项总结文件的软硬链接 本篇文章将重点讲解文件系统中的一个重要的知识点&#xff1a; 即文件的软硬链接。 软链接 对于软链接的讲解&#xff0c;我们先来使用一个指令看看效果&#xff1a;ln -s 被…

Java SE:类与对象的认识

Java中的类与对象&#xff1a;构建程序世界的基石 在Java编程的世界里&#xff0c;类与对象是面向对象编程&#xff08;OOP&#xff09;的核心概念&#xff0c;它们就像构建大厦的砖瓦&#xff0c;支撑起整个程序的结构。理解类与对象&#xff0c;是掌握Java编程的关键一步。 类…

Hexo - 免费搭建个人博客03 - 将个人博客托管到github,个人博客公开给大家访问

导言我的博客&#xff1a;https://q164129345.github.io/ 既然要将个人博客托管到github&#xff0c;首先我们肯定要有一个github账户。另外也需要在电脑上安装另外一个著名的代码管理工具git。 一、创建github仓库二、在Hexo设置部署的内容# Deployment## Docs: https://hexo.…

一次Oracle集群脑裂问题分析处理

问题描述 填写问题的基础信息。 系统名称 数据库集群 IP地址 xxxxxx 操作系统 Linux 数据库 Oracle 11.2.0.4 症状表现 问题的症状表现如下 4月26号晚22点02分左右&#xff0c;HIS集群发生脑裂&#xff0c;十几分钟后&#xff08;22.18&#xff09;一节点集群率先获…

0基础法考随手笔记 02(刑诉法专题04 辩护与代理)

0基础法考随手笔记 02&#xff08;刑诉法专题04 辩护与代理&#xff09; 1.值班律师相关权力义务2. 3. 4.什么是强制医疗 注意&#xff1a;为强制医疗指派的律师&#xff0c;是诉讼代理人&#xff0c;不是辩护人&#xff0c;因为此人不会被追究刑事责任。 “强制医疗” 是刑事诉…