五月刷题27——图


今日刷题内容:

前言

  • 一个算法废材的刷题之路开更了, 更新每天刷题的题解内容
  • 注重个人理解,看难度更新题目数量
  • 题目来源于力扣
  • 争取每日都能做出至少一题
  • 语言java、python、c\c++

一、今日题目

只做了两题,昨天没多少时间写题解,今天补上,后面两题等后面不那么忙再刷吧

  1. 1791. 找出星型图的中心节点
  2. 797. 所有可能的路径
  3. 851. 喧闹和富有
  4. 959. 由斜杠划分区域

二、解题思路

1. 1791. 找出星型图的中心节点

  1. edges[i]都是由两个节点构成,已知中心节点会和所有其他节点相连
  2. 从一个节点集合中任选一点,和另一节点集合中的两点进行比较
  3. 如果在另一节点集合中出现则说明该点就是中心节点
  4. 否则是另一节点
class Solution {
    public int findCenter(int[][] edges) {
        int e = edges[0][0];
        if (e == edges[1][0] || e == edges[1][1]){
            return e;
        }
        return edges[0][1];
    }
}
/*
* 根据边来判断,如果是中心点,说明一定在两个点集中都出现
*/

2. 797. 所有可能的路径

又是深度优先搜索,这里先用递归做一下,下次用循环来解决

  1. 要找到所有的路径,即暴力枚举
  2. graph[i]表示点i能到达的所有点集
  3. 定义一个栈stack,初始存入0这个节点
  4. 递的过程把所有点入栈,如果终点是最后一个节点,则把stack中的内容加入列表中
  5. 归的过程中再把stack中的元素出栈
class Solution {
    List<Integer> stack;
    List<List<Integer>> ret;
    
    public void dfs(int n, int[][]graph, int now){
        if (now == n - 1){
            ret.add(new ArrayList<>(stack));  // 不能直接传入stack,只能深复制一个对象
            return;
        }
        for(int i = 0; i < graph[now].length; i++){
            stack.add(graph[now][i]);
            dfs(n, graph, graph[now][i]);
            stack.remove(stack.size() - 1);
        }
    }
    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
        int n = graph.length;  // 获取所有的点的数量
        stack = new ArrayList<>();
        ret = new ArrayList<>();
        stack.add(0);
        dfs(n, graph, 0);
        return ret;
    }
}
/*
* dfs(要找的数, 邻接矩阵, 当前的数)
*/


3. 851. 喧闹和富有



4. 959. 由斜杠划分区域


  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值