算法day30

news2025/7/16 3:26:42

第一题

433. 最小基因变化

        题型转化:可以转化为边权为一的最短路问题

        将最开始的字符串定义为起点,我们将初识字符串每一个元素改变一次定义为移动一个位置,最后的字符串定义为中点,就这样每一次改变一个元素,最后成功改变成最终字符且改变的次数最少的次数就是我们需要的答案;

步骤一:

        使用hash表来存放基因库中的字符串,方便我们在改变字符后检查改变后的字符串是否合理;

        使用hash表2来存放我们已经改变过的字符串,这样方便我们检查我们的已经改变过的字符串变回原来的样子;

步骤二:

        将我们需要改变成的元素放在数组中,这样方便后期改变元素;

步骤三:

        我们改变后的字符串,判断条件(没有改变回之前的样子且满足基因库的条件),才可以存放进队列,进行以下一次的改变;

至此,代码如下:

class Solution {
    public int minMutation(String startGene, String endGene, String[] bank) {
        Set<String> vis = new HashSet<>();//用来标记已经搜索过的状态
        Set<String> hash = new HashSet<>();//用来统计基因库里面的字符串
        for(String s : bank){
            hash.add(s);
        }
        char[] cha = {'A','C','G','T'};
        if(startGene.equals(endGene)) return 0;
        if(!hash.contains(endGene)) return -1;
        Queue<String> q = new LinkedList<>();
        q.add(startGene);
        vis.add(startGene);
        int step = 0;
        while(!q.isEmpty()){
            step++;
            int size = q.size();
            while(size-- != 0){
                String t = q.poll();
                for(int i = 0;i < 8 ;i++){
                    char[] tmp = t.toCharArray();//字符串变数组
                    for(int j = 0 ;j< 4 ;j++){
                        tmp[i] = cha[j];
                        String next = new String(tmp);
                        if(hash.contains(next) && !vis.contains(next)) {
                            if(next.equals(endGene))
                                return step;
                            q.add(next);
                            vis.add(next);
                        }
                    } 
                }
            }
        }
        return -1;
    }
}

第二题

127. 单词接龙

本题分析如上题故事,代码如下:

class Solution {
    public int ladderLength(String beginWord, String endWord, List<String> wordList) {
        Set<String> hash = new HashSet<>();
        Set<String> vis = new HashSet<>();
        for(String s : wordList){
            hash.add(s);
        }
        if(!hash.contains(endWord)) return 0;
        Queue<String> q = new LinkedList<>();
        q.add(beginWord);
        vis.add(beginWord);
        int ret = 1;
        while(!q.isEmpty()){
            ret ++;
            int size = q.size();
            while(size-- != 0){
                String t = q.poll();
                for(int i = 0;i < t.length();i++){
                    char[] tmp = t.toCharArray();
                    for(char ch = 'a';ch <= 'z';ch++){
                        tmp[i] = ch;
                        String next = new String(tmp);
                        if(hash.contains(next) && !vis.contains(next)){
                            if(next.equals(endWord)) return ret;
                            q.add(next);
                            vis.add(next);
                        }
                    }
                }
            }
        }
        return 0;
    }
}

第三题

675. 为高尔夫比赛砍树

        如下图所示,为砍树的图,

        按照题意的规则,就是从(0,0)坐标出发,先到2砍树,再到6、7、9、9、21依次砍树;并最后返回移动的最短次数;

步骤一:

        首先我们遍历整个矩阵,将有树的位置都放入到一个队列中,并按照该位置中树的个数由小到大依次排序;

步骤二:

        我们按照上述队列中位置的顺序,依次进行bfs移动,并记录每一个位置到下一个位置的移动次数,当所有的有效位置都便利完成时即砍完树了,最后返回总移动的步数;        

至此,代码如下:

class Solution {
    int m,n;
    public int cutOffTree(List<List<Integer>> f) {
        m = f.size();
        n = f.get(0).size();
        //1、将所有的树放入到表中,并从小到大排序
        List<int[]> trees = new ArrayList<>();
        for(int i = 0; i<m; i++){
            for(int j = 0; j< n ;j++){
                if(f.get(i).get(j) > 1){
                    trees.add(new int[]{i,j});
                }
            }
        }
        Collections.sort(trees,(a,b) -> {
            return f.get(a[0]).get(a[1]) -  f.get(b[0]).get(b[1]);
        });
        //2、按照顺序砍树
        int ret = 0;
        int bx = 0,by = 0;
        for(int[] t : trees){
            int x = t[0],y = t[1];
            int step = bfs(f,bx,by,x,y);
            if(step == -1) return -1;//此时到不了下一个节点,即砍不了树
            ret += step;
            bx = x;by = y;
        }
        return ret;
    }
    int[] dx = {0,0,1,-1};
    int[] dy = {1,-1,0,0};

    public int bfs (List<List<Integer>> f,int bx, int by, int ex, int ey){
        if(bx == ex && by == ey) return 0;
        Queue<int[]> q = new LinkedList<>();
        boolean[][] vis = new boolean[m][n];
        q.add(new int[]{bx,by});
        vis[bx][by] = true;

        int step = 0;
        while(!q.isEmpty()){
            step ++;
            int sz = q.size();
            while(sz-- != 0){
                int[] t = q.poll();
                int a = t[0],b = t[1];
                for(int i = 0; i < 4;i++){
                    int x = a+dx[i],y = b+dy[i];
                    if(x >= 0 && y >=0 && y<n && x<m && f.get(x).get(y) != 0 && !vis[x][y]){
                        if(x == ex && y == ey) return step;
                        q.add(new int[]{x,y});
                        vis[x][y] = true;
                    }
                }
            }
        } 
        return -1;
    }
}

ps:本次的内容就到这里了,如果对你有所帮助的话就请一键三连哦!!!

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

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

相关文章

springboot3 基础特性(1)

文章目录 一、SpringApplication三种方式1.1 基础方式1.2.自定义 SpringApplication1.3、FluentBuilder API 二、自定义Banner三、Profiles3.1 什么是 Profiles &#xff1f;3.2 声明Profiles3.3 激活配置文件3.3.1 分组3.3.2 环境包含3.3.3 激活方式3.3.4 配置优先级 一、Spri…

大型医院手术麻醉系统源码,前端采用Vue,Ant-Design开发,稳定成熟

医院手麻系统源码&#xff0c;手术麻醉信息系统&#xff0c;C#源码 医院手术麻醉信息系统包含了手术申请、排班、术前、术中、术后&#xff0c;直至出院的全过程。通过与相关医疗设备连接&#xff0c;与大屏幕显示公告相连接&#xff0c;实现了手术麻醉临床应用数据链全打通。…

一文让你清晰了解医疗行业采购堡垒机的必要性

医疗行业&#xff0c;一个与大家息息相关的行业。随着医疗行业的快速发展和信息化建设的深入推进&#xff0c;传统网络安全防护手段已经难以满足现代医疗信息系统的安全需求&#xff0c;特别是在处理敏感的患者信息和保障医院内部数据安全方面。因此采购堡垒机是非常必要的。 堡…

在BFT购买到了一款超好用的夹爪,发现BFT Robotics方便又专业

“买机器人&#xff0c;上BFT” BFT作为一站式机器人工业互联网平台&#xff0c;提供了多种夹爪产品&#xff0c;包括但不限于Robotiq品牌的夹爪。这些夹爪产品广泛应用于自动化生产线&#xff0c;提高生产效率和精度。以下是对BFT购买的夹爪进行的详细测评。 我之前在BFT上购…

Vue33-更新流程

一、更新流程预览 二、<template>标签说明 <template>元素不能作为根元素。 三、beforeUpdate函数 四、updated函数

【C++游戏程序】easyX图形库还原游戏《贪吃蛇大作战》(一)

一.游戏逻辑概述 游戏完成图如图下所示&#xff1a; 根据游戏设定&#xff0c;需要实现的总体框架如下&#xff1a; 场景中有玩家可以操纵的初始角色-贪吃蛇场景中有AI自动操作的敌人-敌对贪吃蛇场景中的彩色圆点可以被敌人或者玩家吃掉&#xff0c;并且增加分数玩家触碰到敌人…

华为大咖说 | AI 是行业的未来, 还是另一个“元宇宙”?

本文作者&#xff1a;陈冠宏&#xff08;华为网络MSSD首席顾问&#xff09;全文约4497字&#xff0c;阅读约需10分钟 在本年度的517电信日上&#xff0c;中国电信高层在产品升级计划发布会中喊出“ALL in AI”战略&#xff0c;其震撼力让人瞩目。 自2022年11月OpenAI推出划时代…

全国各城市劳动力就业及收入状况数据, 2020-2022年,附高清可视化地图

基本信息. 数据名称: 全国各城市劳动力就业及收入状况数据 数据格式: Shp、excel 数据时间: 2020-2022年 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;网络公开数据 数据可视化.

【SpringCloud学习笔记】RabbitMQ(中)

1. 交换机概述 前面《RabbitMQ上篇》我们使用SpringAMQP来演示如何用Java代码操作RabbitMQ&#xff0c;当时采用的是生产者直接将消息发布给队列&#xff0c;但是实际开发中不建议这么做&#xff0c;更加推荐生产者将消息发布到交换机(exchange)&#xff0c;然后由exchange路由…

AI 大模型的赛点:通用与垂直之争

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

机器视觉:光源的类型以及主要参数

光源在机器视觉中起着决定性的作用&#xff0c;决定了视觉算法的复杂性&#xff0c;也决定了视觉系统的精度和稳定性。光源用于突出目标物体的特征&#xff0c;增加目标物体与背景的对比度&#xff0c;克服环境光线的干扰。光源的选择与打光方式在视觉系统的前期评估中非常重要…

【DIY飞控板PX4移植】BARO模块BMP388气压计的PCB硬件设计和PX4驱动配置

BARO模块BMP388气压计的PCB硬件设计和PX4驱动配置 BMP388简介硬件设计封装原理图PCB设计引脚选择问题 PX4驱动配置飞控板的配置文件夹结构default.px4board文件nuttx-config/nsh/defconfig文件nuttx-config/include/board.h文件src/board_config.h文件src/i2c.cpp文件init/rc.b…

Springboot防疫知识科普系统-计算机毕业设计源码03531

摘 要 如今计算机行业的发展极为快速&#xff0c;搭载于计算机软件运行的数据库管理系统在各行各业得到了广泛的运用&#xff0c;其在数据管理方面具有的准确性和高效性为大中小企业的日常运营提供了巨大的帮助。自从2020年新冠疫情爆发以来&#xff0c;防疫成了社会关注的重中…

LLM 大模型学习:数据预处理、模板设计以

在模型训练过程中&#xff0c;数据及数据处理是最为重要的工作之一。在当前模型训练流程趋于成熟的情况下&#xff0c;数据集的好坏&#xff0c;是决定了该次训练能否成功的最关键因素。 在上一篇中&#xff0c;我们提到了模型训练的基本原理是将文字转换索引再转换为对应的向…

开放式耳机哪个品牌质量比较好?2024高性价比机型推荐!

随着音乐技术的不断发展&#xff0c;开放式耳机已成为音乐发烧友们的另外一种选择。从最初的简单音质&#xff0c;到如今的高清解析&#xff0c;开放式耳机不断进化升级。音质纯净&#xff0c;佩戴舒适&#xff0c;无论是街头漫步还是家中放松时候&#xff0c;都能带给你身临其…

Arrays与Lambda

Arrays 默认排序&#xff1a; 按照指定规则排序&#xff1a; 细节&#xff1a; 底层原理&#xff1a; 代码实现&#xff1a;o1-o2:升序排列 o2-o1:降序排列 Lambda表达式&#xff1a;简化匿名内部类方法 函数式编程&#xff1a; 格式&#xff1a; 总结&#xff1a; …

Web应用安全测试-业务功能滥用(一)

Web应用安全测试-业务功能滥用&#xff08;一&#xff09; 1、短信定向转发 漏洞描述&#xff1a;短信接收人可任意指定 测试方法&#xff1a;拦截发送短信的请求&#xff0c;将手机号改为测试人员的手机号&#xff0c;测试是否可接收短信验证码。 风险分析&#xff1a;攻击…

动态防护开启教程和体验感受

动态防护是雷池 WAF 社区版在版本 [6.0.0] 中新增的一个功能&#xff0c;它属于站点高级防护的一部分。动态防护的主要作用是自动动态加密网站的 HTML 和 JavaScript 源码&#xff0c;目的是阻止爬虫和攻击自动化程序的分析。这项功能在 [6.0.0] 版本中标记为 BETA 版本&#x…

【Linux】进程_3

文章目录 五、进程3. 进程4. 进程状态 未完待续 五、进程 3. 进程 在当前&#xff0c;我们只能通过执行可执行程序来让操作系统帮我们启动进程&#xff0c;那我们如何使用代码来自己启动进程呢&#xff1f;我们可以使用 fork() 函数。作用是创建子进程。 我们创建一个程序来…

echarts学习:使用dataset管理数据

前言 在我们公司的组件库中有许多echarts图表相关的组件&#xff0c;这些组件在使用时&#xff0c;只需将图表数据以特定的格式传入组件中&#xff0c;十分方便。因此当我得知echarts 可以使用dataset集中管理数据时&#xff0c;我就决定自己一定要搞懂它&#xff0c;于是在最…