代码随想录算法训练营第四十六四十七天

news2025/7/13 7:49:37

卡码网题目:

  • 110. 字符串接龙
  • 105. 有向图的完全联通
  • 106. 岛屿的周长
  • 107. 寻找存在的路径

其他:

今日总结
往期打卡


110. 字符串接龙

跳转: 110. 字符串接龙

学习: 代码随想录公开讲解

问题:

字典 strList 中从字符串 beginStr 和 endStr 的转换序列是一个按下述规格形成的序列:

  1. 序列中第一个字符串是 beginStr。

  2. 序列中最后一个字符串是 endStr。

  3. 每次转换只能改变一个字符。

  4. 转换过程中的中间字符串必须是字典 strList 中的字符串,且strList里的每个字符串只用使用一次。

给你两个字符串 beginStr 和 endStr 和一个字典 strList,找到从 beginStr 到 endStr 的最短转换序列中的字符串数目。如果不存在这样的转换序列,返回 0。

思路:

这题的关键是如何构图,可以提前建好字典,通过遍历各位替换字母查看新建字符串是否合法来遍历下一个位置
也可以通过构建分别清除各位字母剩下字母对可能值列表的映射来确认一次转换后可能到达的位置

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码(字母替换):

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String beginStr = scanner.next();
        String endStr = scanner.next();
        List<String> wordList = new ArrayList<>();
        wordList.add(beginStr);
        wordList.add(endStr);
        for(int i=0;i<n;i++){
            wordList.add(scanner.next());
        }
        int count = bfs(beginStr,endStr,wordList);
        System.out.println(count);
    }
    public static int bfs(String beginStr,String endStr,List<String> wordList){
        int len = 1;
        Set<String> set = new HashSet<>(wordList);
        Set<String> visited = new HashSet<>();
        Queue<String> queue = new LinkedList<>();
        visited.add(beginStr);
        queue.add(beginStr);
        queue.add(null);
        while(!queue.isEmpty()){
            String node = queue.poll();
            if(node==null){
                if(!queue.isEmpty()){
                    len++;
                    queue.add(null);
                }
                continue;
            }
            char[] charArrays = node.toCharArray();
            for(int i=0;i<charArrays.length;i++){
                char old = charArrays[i];
                for(char j = 'a';j<='z';j++){
                    charArrays[i] = j;
                    String newWord = new String(charArrays);
                    if(set.contains(newWord)&&!visited.contains(newWord)){
                        queue.add(newWord);
                        visited.add(newWord);
                        if(newWord.equals(endStr)) return len+1;
                    }
                }
                charArrays[i] = old;
            }
        }
        return 0;
    }
}

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2)

代码(字母映射):

import java.util.*;
class Main{
    public static  void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        String beginStr = sc.next();
        String endStr = sc.next();
        List<Map<String,List<String>>> maps = new ArrayList<>();
        for(int i=0;i<endStr.length();i++){
            String sub = endStr.substring(0,i)+endStr.substring(i+1);
            Map<String, List<String>> map = new HashMap<>();
            List<String> list = new ArrayList<>();
            list.add(endStr);
            map.put(sub,list);
            maps.add(map);
        }
        for(int i=0;i<N;i++){
            String tmp = sc.next();
            for(int j=0;j<endStr.length();j++){
                String sub = tmp.substring(0,j)+tmp.substring(j+1);
                Map<String, List<String>> map = maps.get(j);
                List<String> list = map.getOrDefault(sub,new ArrayList<>());
                list.add(tmp);
                map.put(sub,list);
            }
        }
 
 
        Set<String> vis = new HashSet<>();
        Queue<String> queue = new LinkedList<>();
        queue.add(beginStr);
        int ans = 1;
        while(!queue.isEmpty()){
            int l = queue.size();
            ans++;
            for(int i=0;i<l;i++){
                String tmp = queue.poll();
                for(int j=0;j<endStr.length();j++){
                    String sub = tmp.substring(0,j)+tmp.substring(j+1);
                    Map<String, List<String>> map = maps.get(j);
                    List<String> list = map.getOrDefault(sub,new ArrayList<>());
                    if(list.contains(endStr)){
                        System.out.println(ans);
                        return;
                    }
                    for(String str:list){
                        if(vis.contains(str)) continue;
                        vis.add(str);
                        queue.add(str);
                    }
 
                }
            }
        }
        System.out.println(0);
    }
}

105. 有向图的完全联通

跳转: 105. 有向图的完全联通

学习: 代码随想录公开讲解

问题:

给定一个有向图,包含 N 个节点,节点编号分别为 1,2,…,N。现从 1 号节点开始,如果可以从 1 号节点的边可以到达任何节点,则输出 1,否则输出 -1。

例:
在这里插入图片描述
从 1 号节点可以到达任意节点,输出 1。

思路:

直接标记好bfs即可

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

import java.util.*;

class Main {
    private static boolean bfs(Map<Integer, List<Integer>> map, int x, int N) {
        Queue<Integer> queue = new LinkedList<>();
        Set<Integer> vis = new HashSet<>();
        vis.add(x);
        queue.add(x);
        while (!queue.isEmpty()) {
            int tmp = queue.poll();
            for (int i : map.getOrDefault(tmp, new ArrayList<>())) {
                if (vis.contains(i)) continue;
                queue.add(i);
                vis.add(i);
            }
        }
        return vis.size() == N;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int K = sc.nextInt();
        Map<Integer, List<Integer>> map = new HashMap<>();
        for (int i = 0; i < K; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            List<Integer> list = map.getOrDefault(x, new ArrayList<>());
            list.add(y);
            map.put(x, list);
        }
        if (bfs(map, 1, N))
            System.out.println(1);
        else System.out.println(-1);

    }
}


106. 岛屿的周长

跳转: 106. 岛屿的周长

学习: 代码随想录公开讲解

问题:

给定一个由 1(陆地)和 0(水)组成的矩阵,岛屿是被水包围,并且通过水平方向或垂直方向上相邻的陆地连接而成的。

你可以假设矩阵外均被水包围。在矩阵中恰好拥有一个岛屿,假设组成岛屿的陆地边长都为 1,请计算岛屿的周长。岛屿内部没有水域。

例:
在这里插入图片描述
岛屿的周长为 14。

思路:

边长和周围不是陆地的长度是一致的(越界或水都是边界,算1单位边长),直接bfs即可

复杂度:

  • 时间复杂度: O ( n m ) O(nm) O(nm)
  • 空间复杂度: O ( n m ) O(nm) O(nm)

代码:

import java.util.*;
 
class Main {
 
    public static void main(String[] args) {
        int ans = 0;
        int[][] DISTANCE = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
 
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        int[][] map = new int[N][M];
        for (int i = 0; i < N; i++)
            for (int j = 0; j < M; j++)
                map[i][j] = sc.nextInt();
        for (int i = 0; i < N; i++)
            for (int j = 0; j < M; j++)
                if (map[i][j] == 1)
                    for (int k = 0; k < 4; k++) {
                        int n = i + DISTANCE[k][0];
                        int m = j + DISTANCE[k][1];
                        if (n < 0 || m < 0 || n >= map.length || m >= map[0].length || map[n][m] == 0)
                            ans++;
                    }
        System.out.println(ans);
 
    }
}

并查集理论

学习: 代码随想录公开讲解

并查集就是把同类节点串起来,用父级是否相等判断是否有关联(对于无向图而言即:是否联通)

有两种优化方法,路径压缩和按秩合并

  • 路径压缩就是查找父级后递归回去的过程直接指向最前父级
    在这里插入图片描述

  • 按秩合并就是如果树深度不同小深度连到大的身上,减少最大查询深度的增加.
    在这里插入图片描述

107. 寻找存在的路径

跳转: 107. 寻找存在的路径

学习: 代码随想录公开讲解

问题:

给定一个包含 n 个节点的无向图中,节点编号从 1 到 n (含 1 和 n )。

你的任务是判断是否有一条从节点 source 出发到节点 destination 的路径存在。

思路:

并查集模板题目

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

import java.util.Scanner;
public class Main{
    static int[] father;
    private static boolean isSamed(int a,int b){
        int x = find(a);
        int y = find(b);
        return x==y;
    }
    private static void join(int a,int b){
        int x = find(a);
        int y = find(b);
        if(x==y) return;
        father[y] = father[x];
    }
    private static int find(int a){
        return father[a]==a?a:(father[a]=find(father[a]));
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt()+1;
        int m = scanner.nextInt();
        father = new int[n];
        for(int i=0;i<n;i++)
            father[i] = i;
        for(int i=0;i<m;i++){
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            join(x,y);
        }
        int source = scanner.nextInt();
        int destination = scanner.nextInt();
        System.out.println(isSamed(source,destination)?1:0);
    }
}

总结

练习了bfs和并查集

往期打卡

代码随想录算法训练营第四十五天

代码随想录算法训练营第四十四天

代码随想录算法训练营第四十二&四十三天

代码随想录算法训练营第四十一天

代码随想录算法训练营第四十天

代码随想录算法训练营第三十九天

代码随想录算法训练营第三十八天

代码随想录算法训练营第三十七天

代码随想录算法训练营第三十五&三十六天

代码随想录算法训练营第三十四天

代码随想录算法训练营第三十三天(补)

代码随想录算法训练营第三十二天

代码随想录算法训练营第三十一天

代码随想录算法训练营第三十天(补)

代码随想录算法训练营第二十九天

代码随想录算法训练营第二十八天

代码随想录算法训练营第二十七天(补)

代码随想录算法训练营第二十六天

代码随想录算法训练营第二十五天

代码随想录算法训练营第二十四天

代码随想录算法训练营第二十三天

代码随想录算法训练营周末四

代码随想录算法训练营第二十二天(补)

代码随想录算法训练营第二十一天

代码随想录算法训练营第二十天

代码随想录算法训练营第十九天

代码随想录算法训练营第十八天

代码随想录算法训练营第十七天

代码随想录算法训练营周末三

代码随想录算法训练营第十六天

代码随想录算法训练营第十五天

代码随想录算法训练营第十四天

代码随想录算法训练营第十三天

代码随想录算法训练营第十二天

代码随想录算法训练营第十一天

代码随想录算法训练营周末二

代码随想录算法训练营第十天

代码随想录算法训练营第九天

代码随想录算法训练营第八天

代码随想录算法训练营第七天

代码随想录算法训练营第六天

代码随想录算法训练营第五天

代码随想录算法训练营周末一

代码随想录算法训练营第四天

代码随想录算法训练营第三天

代码随想录算法训练营第二天

代码随想录算法训练营第一天

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

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

相关文章

华硕FL8000U加装16G+32G=48G内存条

华硕FL8000U加装16G32G48G内存条 一、华硕FL8000U加装内存条endl 一、华硕FL8000U加装内存条 相关视频链接: https://www.bilibili.com/video/BV1gw4dePED8/ endl

勇闯Chromium—— Chromium的多进程架构

问题 构建一个永不崩溃或挂起的渲染引擎几乎是不可能的,构建一个绝对安全的渲染引擎也几乎是不可能的。 从某种程度上来说,2006 年左右的网络浏览器状态与过去单用户、协作式多任务操作系统的状况类似。正如在这样的操作系统中,一个行为不端的应用程序可能导致整个系统崩溃…

软件质量保证与测试实验

课程  软件质量保证与测试 目的&#xff1a;练习软件测试中白盒测试方法 内容&#xff1a; 测试如下程序段&#xff1a; #include <stdio.h>int main() {int i 1, n1 0, n2 0;float sum 0.0;float average;float score[100];printf("请输入分…

历年华东师范大学保研上机真题

2025华东师范大学保研上机真题 2024华东师范大学保研上机真题 2023华东师范大学保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school?classification1 简单一位数代数式计算 题目描述 给一个小学生都会算的1位数与1位数运算的代数式&#xff0c;请你求出这个表…

在机器学习中,L2正则化为什么能够缓过拟合?为何正则化等机制能够使一个“过度拟合训练集”的模型展现出更优的泛化性能?正则化

在现代机器学习的发展历程中&#xff0c;过拟合&#xff08;Overfitting&#xff09;始终是亟需克服的重要挑战。其表现如同在训练数据上构建过度复杂的映射函数&#xff0c;虽能实现近乎完美的拟合&#xff0c;但其泛化能力却显著受限&#xff0c;导致模型在测试集或实际应用中…

k8s部署ELK补充篇:kubernetes-event-exporter收集Kubernetes集群中的事件

k8s部署ELK补充篇&#xff1a;kubernetes-event-exporter收集Kubernetes集群中的事件 文章目录 k8s部署ELK补充篇&#xff1a;kubernetes-event-exporter收集Kubernetes集群中的事件一、kubernetes-event-exporter简介二、kubernetes-event-exporter实战部署1. 创建Namespace&a…

C++性能相关的部分内容

C性能相关的部分内容 与底层硬件紧密结合 大端存储和小端存储&#xff08;硬件概念&#xff09; C在不同硬件上运行的结果可能不同 比如&#xff1a;输入01234567&#xff0c;对于大端存储的硬件会先在较大地址上先进行存储&#xff0c;而对于小端存储的硬件会先在较小地址上…

AI进行提问、改写、生图、联网搜索资料,嘎嘎方便!

极客侧边栏-AI板块 目前插件内已接入DeepSeek-R1满血版、Qwen3满血版 、豆包/智谱最新发布的推理模型以及各种顶尖AI大模型&#xff0c;并且目前全都可以免费不限次数使用&#xff0c;秒回不卡顿&#xff0c;联网效果超好&#xff01; 相比于市面上很多AI产品&#xff0c;极客…

GStreamer开发笔记(四):ubuntu搭建GStreamer基础开发环境以及基础Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/147714800 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、O…

2021年认证杯SPSSPRO杯数学建模A题(第二阶段)医学图像的配准全过程文档及程序

2021年认证杯SPSSPRO杯数学建模 A题 医学图像的配准 原题再现&#xff1a; 图像的配准是图像处理领域中的一个典型问题和技术难点&#xff0c;其目的在于比较或融合同一对象在不同条件下获取的图像。例如为了更好地综合多种信息来辨识不同组织或病变&#xff0c;医生可能使用…

CV中常用Backbone-3:Clip/SAM原理以及代码操作

前面已经介绍了简单的视觉编码器&#xff0c;这里主要介绍多模态中使用比较多的两种backbone&#xff1a;1、Clip&#xff1b;2、SAM。对于这两个backbone简单介绍基本原理&#xff0c;主要是讨论使用这个backbone。 1、CV中常用Backbone-2&#xff1a;ConvNeXt模型详解 2、CV中…

RPC 协议详解、案例分析与应用场景

一、RPC 协议原理详解 RPC 协议的核心目标是让开发者像调用本地函数一样调用远程服务&#xff0c;其实现过程涉及多个关键组件与流程。 &#xff08;一&#xff09;核心组件 客户端&#xff08;Client&#xff09;&#xff1a;发起远程过程调用的一方&#xff0c;它并不关心调…

dify-plugin-daemon的.env配置文件

源码位置&#xff1a;dify-plugin-daemon\.env 本文使用dify-plugin-daemon v0.1.0版本&#xff0c;主要总结了dify-plugin-daemon\.env配置文件。为了本地调试方便&#xff0c;采用本地运行时环境WSL2Ubuntu22.04方式运行dify-plugin-daemon服务。 一.服务器基本配置 服务器…

(九)PMSM驱动控制学习---无感控制之高阶滑膜观测器

在之前的文章中&#xff0c;我们介绍了永磁同步电机无感控制中的滑模观测器&#xff0c;但是同时我们也认识到了他的缺点&#xff1a;因符号函数带来的高频切换分量&#xff0c;使用低通滤波器引发相位延迟&#xff1b;在本篇文章&#xff0c;我们将会介绍高阶滑模观测器的无感…

Devicenet主转Profinet网关助力改造焊接机器人系统智能升级

某汽车零部件焊接车间原有6台焊接机器人&#xff08;采用Devicenet协议&#xff09;需与新增的西门子S7-1200 PLC&#xff08;Profinet协议&#xff09;组网。若更换所有机器人控制器或上位机系统&#xff0c;成本过高且停产周期长。 《解决方案》 工程师选择稳联技术转换网关…

《STL--list的使用及其底层实现》

引言&#xff1a; 上次我们学习了容器vector的使用及其底层实现&#xff0c;今天我们再来学习一个容器list&#xff0c; 这里的list可以参考我们之前实现的单链表&#xff0c;但是这里的list是双向循环带头链表&#xff0c;下面我们就开始list的学习了。 一&#xff1a;list的…

python的pip怎么配置的国内镜像

以下是配置pip国内镜像源的详细方法&#xff1a; 常用国内镜像源列表 清华大学&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple阿里云&#xff1a;https://mirrors.aliyun.com/pypi/simple中科大&#xff1a;https://pypi.mirrors.ustc.edu.cn/simple华为云&#xff1…

PCB 通孔是电容性的,但不一定是电容器

哼&#xff1f;……这是什么意思&#xff1f;…… 多年来&#xff0c;流行的观点是 PCB 通孔本质上是电容性的&#xff0c;因此可以用集总电容器进行建模。虽然当信号的上升时间大于或等于过孔不连续性延迟的 3 倍时&#xff0c;这可能是正确的&#xff0c;但我将向您展示为什…

公有云AWS基础架构与核心服务:从概念到实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 &#xff08;初学者技术专栏&#xff09; 一、基础概念 定义&#xff1a;AWS&#xff08;Amazon Web Services&#xff09;是亚马逊提供的云计算服务&a…

Python60日基础学习打卡D35

import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler import time import matplotlib.pyplot as plt# 设置GPU设…