算法练习-2:送外卖

news2024/9/21 12:37:55

n 个小区排成一列,编号为从 0 到 n-1 。一开始,美团外卖员在第0号小区,目标为位于第 n-1 个小区的配送站。
给定两个整数数列 a[0]~a[n-1] 和 b[0]~b[n-1] ,在每个小区 i 里你有两种选择:
1) 选择a:向前 a[i] 个小区。
2) 选择b:向前 b[i] 个小区。

把每步的选择写成一个关于字符 ‘a’ 和 ‘b’ 的字符串。求到达小区n-1的方案中,字典序最小的字符串。如果做出某个选择时,你跳出了这n个小区的范围,则这个选择不合法。
• 当没有合法的选择序列时,输出 “No solution!”。
• 当字典序最小的字符串无限长时,输出 “Infinity!”。
• 否则,输出这个选择字符串。

字典序定义如下:串s和串t,如果串 s 字典序比串 t 小,则
• 存在整数 i ≥ -1,使得∀j,0 ≤ j ≤ i,满足s[j] = t[j] 且 s[i+1] < t[i+1]。
• 其中,空字符 < ‘a’ < ‘b’。


简述:现有一个整数n,及两个长度为n的数组num1和num2,每个数组中的元素i表示能够在当前位置移动的距离(正/负),每次在位置i移动时可以选择num1[i]或num2[i],要求通过选择num1和num2来移动,最终到达n-1的位置,其中使用"a"和"b"分别表示选择的数组,最终得到一个字符串s,返回最小字典序的s,其他情况:若最小字典序无限长则返回"Infinity!",若不能到达n-1位置则返回"No solution!"

思路:

首先理解题意,现在需要返回三种值:s,"Infinity!"和"No solution!":

① s和"No solution!":当能到达n-1位置并返回最小字典序s,不能到达返回"No solution!";(解决,能过90%样例)

② "Infinity!":需要能够到达n-1的位置,同时s为最小字典序,且路径中有环;(本题难点,刚开始没理解为什么有环还能到终点,不应该在环里循环出不去吗,画了个图才理解)

简单讲就是,由于每个位置有两个选择,所以即使其中一个选择遇到环,最终也能在该位置通过选择另一个选择来跳出环(如果两个选择都是环,那就是不可达"No solution!")。

1、选择DFS算法求解;

2、设定一个全局数组来记录当前位置选择过几遍,来解决是否存在环的问题;

3、对于最小字典序,在DFS里将选择"a"的数组放在选择"b"的数组上面,就可以保证最终得到的是最小字典序(可以这样理解,由于有两个数组,所以可以看做成一个二叉树遍历,把"a"放在上面表示先序遍历,而先序遍历先遍历根"a",然后左子树"a",最后右子树"b",可能理解有误欢迎交流讨论);

代码:

import java.util.*;

public class Main {
    
    private static StringBuilder ans = new StringBuilder(); // 记录字典序最小字符串
    private static int[] a; // 数组a
    private static int[] b; // 数组b
    private static int[] visit; // 记录是否经过当前位置
    private static boolean loop = false; // 判断是否有环
    
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int len = in.nextInt();
        a = new int[len];
        b = new int[len];
        visit = new int[len];
        
        for(int i = 0; i < len; i++){
            a[i] = in.nextInt();
        }
        for(int i = 0; i < len; i++){
            b[i] = in.nextInt();
        }
        
        if(dfs(0, len-1)){
            if(loop){ // 能到达存在环
                System.out.println("Infinity!");
            }else{ // 能到达不存在环
                System.out.println(ans);
            }
        }else{ // 不能到达
            System.out.println("No solution!");
        }
        
    }
    
    // 输入当前位置及最终位置,返回是否到达终点
    public static boolean dfs(int cur, int target){
        // 边界判断
        if(cur < 0 || cur > target){
            return false;
        }
        // 条件判断
        if(cur == target){
            return true;
        }
        // 是否存在环
        if(visit[cur] > 0){
            visit[cur]++;
            return false;
        }
        visit[cur]++; // 记录当前位置访问次数

        /*
           选择"a"的过程,先添加字符,然后判断当前位置能否到达终点,
           如果能到达返回true,能到达的同时如果当前位置访问次数大于1,说明该位置存在环。
           如果不能到达,则删除"a",去判断"b"
        */
        ans.append("a");
        if(dfs(cur+a[cur], target)){
            if(visit[cur] > 1){
                loop = true;
            }
            return true;
        }
        ans.deleteCharAt(ans.length()-1);
        
        ans.append("b");
        if(dfs(cur+b[cur], target)){
            if(visit[cur] > 1){
                loop = true;
            }
            return true;
        }
        ans.deleteCharAt(ans.length()-1);
        
        // "a"和"b"都不能到达,返回false
        return false;
    }
    
}

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

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

相关文章

shiro环境搭建

源码部署 这种方法相对复杂&#xff0c;如果不需要分析源码直接用docker就行 前置条件&#xff1a;Maven Ideal Tomcat 下载方式1&#xff1a;https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4&#xff0c;然后将文件夹导入ideal下载方式2&#xff1a;将shiro…

装饰者模式-java实现

的简介 装饰模式又称为“包装(Wrapper)模式”&#xff0c;以对客户端透明的方式扩展对象的功能&#xff0c;是继承关系的一个替代方案。动态地给对象添加一些额外地职责&#xff0c;就增加功能而言&#xff0c;装饰模式比生成子类更加灵活。 一般来说&#xff0c;一些特殊场景…

C++ new和delete详解

文章目录 1、 C C C内存分布2、 C C C内存管理方式3、 n e w new new 和 d e l e t e delete delete 底层实现4、定位 n e w new new表达式&#xff08;了解&#xff09;5、 m a l l o c 、 f r e e 和 n e w 、 d e l e t e malloc、free和new、delete malloc、free和new、de…

初识Linux:第六篇

初识Linux&#xff1a;第六篇 初识Linux&#xff1a;第六篇1.Linux 软件包管理器 yum2.Linux下的软件生态3.Linux中编辑器vim的使用3.1命令模式3.11控制光标移动3.12复制&#xff0c;粘贴&#xff0c;剪切&#xff0c;删除3.13替换&#xff0c;大小写转换3.14撤销与反撤销3.15查…

深度学习笔记之循环神经网络(六)长短期记忆神经网络(LSTM)

深度学习笔记之循环神经网络——长短期记忆神经网络[LSTM] 引言回顾&#xff1a; RNN \text{RNN} RNN的反向传播过程 RNN \text{RNN} RNN反向传播的梯度消失问题 长短期记忆神经网络遗忘门结构输入门结构遗忘门与输入门的特征融合操作输出门结构 个人感悟 引言 上一节介绍了循…

【C++】哈希——unordered系列容器哈希概念哈希冲突

文章目录 1. unordered系列的关联式容器1.1 引言1.2 unordered_map的使用说明1.3 unordered_set的使用说明1.4 unordered_set和unordered_map的应用1.5 性能比较 2. 哈希概念3. 哈希函数4. 哈希冲突5. 哈希冲突的解决——开散列和闭散列5.1 闭散列5.2 开散列 1. unordered系列的…

C++:征服C指针:关于指针

关于指针 1.看一个简单的程序&#xff0c;来接触下指针二级目录三级目录 本章节&#xff0c;我们重点分析C指针&#xff0c;首先我们从指针的概念谈起 &#x1f49a;&#x1f49a;&#x1f49a; 指针是一种保存变量地址的变量&#xff0c;并在C中频繁使用在C语言标准中&#xf…

数据结构与算法01:时间复杂度

目录 【复杂度分析】 【降低时间复杂度】 降低时间复杂度的必要性 【每日一练】 不管是使用什么编程语言或者哪种数据库&#xff0c;不管是解决项目中的什么问题&#xff0c;都离不开数据结构与算法。所谓数据结构就是指某一种数据的存储结构&#xff0c;所谓算法就是操作这…

【ClickHouse】

文章目录 一、表引擎1、表引擎的作用2、TinyLog3、Memory4、MergeTree二、数据库引擎1、作用--跨种类交换数据2、示例 三、MergeTree引擎1、简单使用2、分区partition by3、主键primary key4、order by&#xff08;必填&#xff09; 一、表引擎 1、表引擎的作用 CK表引擎决定…

U盘无法格式化?试试这几种快速有效的方法!

我们在通过Windows文件资源管理器、磁盘管理或Diskpart命令格式化U盘过程中&#xff0c;会遇到Windows无法格式化U盘。导致出现该问题的原因可能有以下几种&#xff1a; U盘被病毒和恶意软件感染&#xff1b; U盘有坏道&#xff1b; U盘已经物理损坏&#xff1b; 1.消除可能…

数据类型的陷进,从表象看本质!

哪些值转为布尔值为false 1、undefined&#xff08;未定义&#xff0c;找不到值时出现&#xff09; 2、null&#xff08;代表空值&#xff09; 3、false&#xff08;布尔值的false&#xff0c;字符串"false"布尔值为true&#xff09; 4、0&#xff08;数字0&…

LeetCode每日一题之209长度最小的子数组

文章目录 问题描述方法一&#xff1a;暴力求解方法二&#xff1a;滑动窗口 问题描述 方法一&#xff1a;暴力求解 暴力求解法&#xff1a;时间复杂度O(n^2)&#xff0c;空间复杂度O(1)。 暴力求解法的思想&#xff1a;每一次遍历数组&#xff0c;然后更新result的值&#xff0…

【Linux基本指令(3)】几十条指令快速入手Linux/到底什么是日志?/指令的运行原理到底是什么?

本文思维导图&#xff1a; 文章目录 13.head指令14.tail指令15.时间相关指令到底什么是日志&#xff1f;时间戳 16.cal指令17.find指令&#xff08;非常重要&#xff09;18.grep指令19.zip/unzip指令20.tar指令&#xff08;非常重要&#xff09;21.bc指令22.uname指令23.几个重…

香橙派4和树莓派4B构建K8S集群实践之六:虚拟主机

1. 说明 根据之前设置好的基础&#xff0c;我打算设置两种不同的虚拟主机运行在这个K8s集群上面&#xff0c;一个是LNMP体系的WebApp&#xff0c;一个是Java SpringBoot体系的WebApp。 1.1 设置表格 - wwwroot 是之前做pvc定义的文件目录&#xff0c;形如&#xff1a;/data0…

外包没有前途的,已经被替换了....

我25岁的时候&#xff0c;外包测试&#xff0c;薪资13.5k&#xff0c;人在深圳。 内卷什么的就不说了&#xff0c;而且人在外包那些高级精英年薪大几十的咱也接触不到&#xff0c;就说说外包吧。假设以我为界限&#xff0c;25岁一线城市13.5k&#xff0c;那22-24大部分情况下是…

花指令问题

前言 想起之前打题的时候经常会遇到一些关乎花指令的问题&#xff0c;但是没有系统地总结归纳花指令去除的姿势&#xff0c;浅浅开一个坑慢慢来写 题1&#xff1a;简单jmp 可以骗过dbg&#xff0c;但是放在ida中就很容易看出来&#xff0c;无效跳转 题目来源&#xff1a;[HD…

七牛云图床设置

文章目录 七牛云图床设置下面是用picgo配置图床SSL证书申请https网站显示http图片解决方案 原文链接图床设置&#xff0c;免费SSL证书申请&#xff0c;https网站显示http链接的图片 七牛云图床设置 登录七牛云官网并进行个人注册&#xff0c;然后找到对象存储 点击空间管理&a…

一种适用于大量租户大量角色权限系统设计

前言 权限管理是每个系统不可缺少的一部分&#xff0c;大部分开发者应该都设计过权限管理系统&#xff0c;很多开发者学习的第一个项目可能就是权限管理系统。但是常见的权限设计在租户量非常大、角色数量非常多时会存在角色权限表数据量指数增长的情况&#xff0c;本文介绍一…

c++代码手撕红黑树

企业里永远是技术驱动理论发展 比起理解红黑树的原理&#xff0c;更重要的是理解红黑树的应用场景&#xff0c;因为某些应用场景的需要&#xff0c;红黑树才会应运而生。 红黑树的特点&#xff1a; 插入&#xff0c;删除&#xff0c;查找都是O(logn)的复杂度。 红黑树的应用…

【lager】日志系统2:测试程序调试

design 官方设计文档 design cmakelist增加plog构建 cmake_minimum_required(VERSION 3.1.3 FATAL_ERROR) project(Lager)set(CMAKE_CXX_STANDARD 11) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)find_package(