图论算法|深度优先搜索理论基础|797.所有可能的路径|广度优先搜索BFS理论基础|200. 岛屿数量

news2024/11/28 14:43:10

深度优先搜索(dfs)理论基础

  1. dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,在换方向(换方向的过程就涉及到了回溯)。
  2. 递归和回溯是相辅相成的
void dfs(参数) {
	if (终止条件) {
	    存放结果;
	    return;
	}
	for (选择:本节点所连接的其他节点) {
	    处理节点;
	    dfs(图,选择的节点); // 递归
	    回溯,撤销处理结果
	}
}

797.所有可能的路径

https://leetcode.cn/problems/all-paths-from-source-to-target/

有向无环图(DAG):

有环无向图是指在图中存在至少一个环(Cycle)的无向图。环是由一系列相互连接的顶点组成的路径,其中第一个顶点和最后一个顶点相同。换句话说,从一个顶点出发,经过若干边,最终又回到了原始的顶点。
我看到题是懵的,不知道数组每个元素代表什么,后来看了答案才明白:数组中的元素相当于数组下标可以去到的地方,比如示例1,代表0可以去1和2,1可以去3,2可以去3
示例2是 :0可以去4,3,1;1可以去3,2,4;2可以去3;3可以去4,
在这里插入图片描述

class Solution {
private:
    vector<vector<int>> result; // 收集符合条件的路径
    vector<int> path; // 0节点到终点的路径
    // x:目前遍历的节点
    // graph:存当前的图
    void dfs (vector<vector<int>>& graph, int x) {
        // 要求从节点 0 到节点 n-1 的路径并输出,所以是 graph.size() - 1
        if (x == graph.size() - 1) { // 找到符合条件的一条路径
            result.push_back(path);
            return;
        }
        for (int i = 0; i < graph[x].size(); i++) { // 遍历节点n链接的所有节点
            path.push_back(graph[x][i]); // 遍历到的节点加入到路径中来
            dfs(graph, graph[x][i]); // 进入下一层递归
            path.pop_back(); // 回溯,撤销本节点
        }
    }
public:
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        path.push_back(0); // 无论什么路径已经是从0节点出发
        dfs(graph, 0); // 开始遍历
        return result;
    }
};

广度优先搜索BFS理论基础

  1. 广搜(bfs)是一圈一圈的搜索过程
  2. 广搜的搜索方式就适合于解决两个点之间的最短路径问题
  3. 我们仅仅需要一个容器,能保存我们要遍历过的元素就可以
    在这里插入图片描述
    广搜代码模板

int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 表示四个方向
// grid 是地图,也就是一个二维数组
// visited标记访问过的节点,不要重复访问
// x,y 表示开始搜索节点的下标
void bfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {
    queue<pair<int, int>> que; // 定义队列
    que.push({x, y}); // 起始节点加入队列
    visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点
    while(!que.empty()) { // 开始遍历队列里的元素
        pair<int ,int> cur = que.front(); que.pop(); // 从队列取元素
        int curx = cur.first;
        int cury = cur.second; // 当前节点坐标
        for (int i = 0; i < 4; i++) { // 开始想当前节点的四个方向左右上下去遍历
            int nextx = curx + dir[i][0];
            int nexty = cury + dir[i][1]; // 获取周边四个方向的坐标
            if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 坐标越界了,直接跳过
            if (!visited[nextx][nexty]) { // 如果节点没被访问过
                que.push({nextx, nexty});  // 队列添加该节点为下一轮要遍历的节点
                visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问
            }
        }
    }

}

200. 岛屿数量

#include <vector>
#include <queue>
using namespace std;

class Solution {
    int res;
    int xy[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; // 方向数组
    void bfs(vector<vector<char>>& grid, vector<vector<bool>>& isTrue, int x, int y) {
        queue<pair<int, int>> que;
        que.push({x, y});
        isTrue[x][y] = true;
        while (!que.empty()) {
            pair<int, int> cur = que.front();
            que.pop();
            int curx = cur.first;
            int cury = cur.second;
            for (int i = 0; i < 4; i++) {
                int nextx = curx + xy[i][0]; //使用新的变量来 计算下一步的x坐标
                int nexty = cury + xy[i][1]; // 计算下一步的y坐标
                if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;
                if (grid[nextx][nexty] == '1' && isTrue[nextx][nexty] == false) {
                    que.push({nextx, nexty});
                    isTrue[nextx][nexty] = true;
                }
            }
        }
    }
public:
    int numIslands(vector<vector<char>>& grid) {
        res = 0;
        vector<vector<bool>> isTrue(grid.size(), vector<bool>(grid[0].size(), false));
        for (int i = 0; i < grid.size(); i++) {
            for (int j = 0; j < grid[0].size(); j++) {
                if (isTrue[i][j] == false && grid[i][j] == '1') {
                    bfs(grid, isTrue, i, j);
                    res++;
                }
            }
        }
        return res;
    }
};

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

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

相关文章

史上最全,接口测试-Fiddler抓包常用功能总结(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Fiddler中常用的功…

三、函数-1.概念和分类

一、定义 函数——是指一段可以直接被另一段程序调用的程序或代码。 程序或代码在MySQL内置了&#xff0c;可以直接调用这些函数。 二、作用 三、分类 字符串函数数值函数日期函数流程函数

性能测试之并发用户数的估计

在计算并发用户数之前&#xff0c;需要先了解2个概念。 并发用户&#xff1a;指的是现实系统中同时操作业务的用户&#xff0c;在性能测试工具中一般称为虚拟用户。并发用户这些用户的最大特征是和服务器产生了交互&#xff0c;这种交互既可以是单向的传输数据&#xff0c;也可…

【社媒营销】如何提升销量和品牌推广?

随着社交媒体的普及和发展&#xff0c;社媒营销已经成为了提升销量和品牌推广的重要方式。社媒营销不仅可以为企业带来更多的曝光率和知名度&#xff0c;还可以帮助企业与消费者建立更加亲密的联系&#xff0c;提升消费者忠诚度和购买意愿。本文一秒推小编将从以下几个方面探讨…

【论文阅读】Feature Inference Attack on Shapley Values

摘要 研究背景 近年来&#xff0c;解释性机器学习逐渐成为一个热门的研究领域。解释性机器学习可以帮助我们理解机器学习模型是如何进行预测的&#xff0c;它可以提高模型的可信度和可解释性。Shapley值是一种解释机器学习模型预测结果的方法&#xff0c;它可以计算每个特征对…

Fragment的基本用法、Fragment和活动间的通信、Fragment的生命周期、动态加载布局的技巧

一、Fragment的简单用法 1、制作Fragment 1.1 新建一个布局文件left_fragment.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"ve…

【小白必看】轻松获取王者荣耀英雄皮肤图片的Python爬虫程序

文章目录 前言项目运行效果图导入模块和库伪装请求头获取英雄列表遍历英雄列表创建英雄目录访问英雄主页并解析HTML代码获取皮肤名称下载皮肤图片完整代码总结 前言 当谈到王者荣耀游戏时&#xff0c;无法忽视的是其丰富多样的英雄皮肤。这些皮肤不仅为玩家提供了个性化的游戏…

文本预处理——文本特征处理

目录 文本特征处理n-gram特征文本长度规范 文本特征处理 n-gram特征 文本长度规范

《面试1v1》Kafka消息是采用Pull还是Push模式

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

(学习笔记-硬件结构)CPU如何执行程序?

冯诺依曼模型 冯诺依曼模型主要由五部分组成&#xff1a;运算器、控制器、存储器、输入设备、输出设备。 控制器&#xff08;Control Unit&#xff09;&#xff1a;从内存中取指令、翻译指令、分析指令&#xff0c;然后根据指令的内存向有关部件发送控制命令&#xff0c;控制相…

E2E工程问题:小周期转大周期Gateway

摘要&#xff1a; 本文讨论一个具体的工程问题&#xff0c;E2E报文对应的信号&#xff0c;由小周期转大周期导致的E2E校验失败问题。 工程中&#xff0c;网关节点很重要的一个功能就是路由。当然&#xff0c;E2E&#xff08;End to End&#xff09;报文也可路由&#xff0c;但…

webpack xxx is not a constructor

环境 webpack5.88.2 vue-router 按需引入 原因 模块循环引用导致 有A B C三个模块 A B模块import C 中导出的class c又依赖B 中Class 的方法 B 又依赖C中的class 此时会导致import 的 C 为undefined

求求你,别这样写简历,我要是HR连面试机会都不给你,别说我没告诉你!

前言 我作为部门的面试官&#xff0c;在此期间也收获了不少简历。但可惜的是&#xff0c;收到的简历数量虽多&#xff0c;但令人中意的却是凤毛菱角&#xff0c;一些应聘者倒不是因为自身能力不足而无法进入面试环节&#xff0c;而是简历本身就没有很好的展示出自己的能力&…

苍穹外卖 Spring Task 来单提醒 催单Apache ECharts day10~11

苍穹外卖-day10 课程内容 Spring Task订单状态定时处理WebSocket来单提醒客户催单 功能实现&#xff1a;订单状态定时处理、来单提醒和客户催单 订单状态定时处理&#xff1a; 来单提醒&#xff1a; 客户催单&#xff1a; 1. Spring Task 1.1 介绍 Spring Task 是Spring框架提供…

k8s中强制删除pv

K8s 集群内有一个已经不再使用的 PV&#xff0c;虽然已经删除了与其关联的 Pod 及 PVC&#xff0c;并对其执行了删除命令&#xff0c;但仍无法正常删除&#xff0c;一直处于 Terminating 状态&#xff1a; 解决办法&#xff1a; 1. 获取pv信息 kubectl get pv 2. 解除pv锁定 …

k8s: kubectl: logs: rotate 问题

https://kubernetes.io/docs/concepts/cluster-administration/logging/ 当kubenet存放container的日志满了的时候&#xff0c;会发生rotate&#xff0c;当rotate发生的时候&#xff0c;是由kubectl logs 这个命令可能会出现以下两个问题&#xff1a; https://github.com/kuber…

30-使用RocketMQ做削峰处理

1、增加排队功能的思路 在出票模块里,一个消费者拿到了某个车次锁,则该车次下所有的票都由他来出,一张一张的出,知道所有的订单都出完。 2、实现排队出票功能 2.1、 修改发送到MQ消息的内容 修改MQ消息内容,只需要通知出哪天和哪个车次的票(即:组成锁的内容),不需要…

网络安全系统中的守护者:如何借助威胁情报 (TI) 提高安全性

在这篇哈巴尔网站上的推文中&#xff0c;我们将解释 TI 缩写背后的含义、为什么需要它、Positive Technologies 收集哪些网络威胁数据以及如何帮助企业预防网络威胁。我们将以四种情况为例&#xff0c;说明公司如何使用 PT Threat Intelligence Feeds 来发现恶意活动并预防攻击…

2023-07-26 LeetCode每日一题(更新数组后处理求和查询)

2023-07-26每日一题 一、题目编号 2569. 更新数组后处理求和查询二、题目链接 点击跳转到题目位置 三、题目描述 给你两个下标从 0 开始的数组 nums1 和 nums2 &#xff0c;和一个二维数组 queries 表示一些操作。总共有 3 种类型的操作&#xff1a; 操作类型 1 为 querie…

uni-app点击按钮弹出提示框(以弹窗的形式显示),选择确定和取消

学习目标&#xff1a; 学习目标如下所示&#xff1a; uni-app点击提交按钮后弹出提示框&#xff0c;&#xff08;以弹窗的形式显示&#xff09;,提示用户是否确认提交&#xff08;即确定和取消&#xff09;&#xff0c;点击确定后调用真正的提交方法&#xff0c;将数据传给后端…