【华为OD题库-037】跳房子2-java

题目

跳房子,也叫跳飞机,是一种世界性的儿童游戏游戏。参与者需要分多个回合按顺序跳到第1格直到房子的最后一格,然后获得一次选房子的机会,直到所有房子被选完,房子最多的人获胜。
跳房子的过程中,如果有踩线等违规行为会结束当前回合,甚至可能倒退几步.假设房子的总格数是count,小红每回合可能连续跳的步数都放在数组steps中,请问数组中是否有一种步数的组合,可以让小红三个回合跳到最后一格?如果有,请输出索引和最小的步数组合(数据保证索引和最小的步数组合是唯一的)。
注意:数组中的步数可以重复,但数组中的元素不能重复使用
输入描述:
第一行输入为房子总格数count,它是int整数类型
第二行输入为每回合可能连续跳的步数,它是int整数数组类型
输出描述
返回索引和最小的满足要求的步数组合(顺序保持steps中原有顺序)
补充说明:
count<=10000,3<=steps.length<=10000,-100000<=steps[i]<=100000
示例1
输入:
9
[1,4,5,2,0,2]
输出:
[4,5,0]
示例2
输入:
9
[1,5,2,0,2,4]
输出:
[5,2,2]
示例3
输入:
12
[-1,2,4,9]
输出:
[-1,4,9]
示例4:
输入
15
[1,9,4,25,10,8,7,5]
输出
[1,4,10]
说明
符合条件的步数集合有:
[1,9,5]
它的下角标之和为:0+1+7=8 ;
[1,4,10]
它的下角标之和为:0+2+4=6
因为6<8,故输出[1,4,10]。

思路

两种思路:

  1. 回溯法
  2. 双指针

回溯法

列举所有的组合,找到符合条件的组合,排列组合思路详见:【JAVA-排列组合】一个套路速解排列组合题

双指针

回溯法可能会超时,所以推荐双指针法。

比如输入的数组是:1,4,5,2,0,2,目标数字是9
先将nums按照升序排序:0 1 2 2 4 5
外层遍历k,范围为0,len-2;
内层设置两个变量,i指向k+1位置,j指向最后一个位置,如下:
在这里插入图片描述
现在计算这三个数的和,0+1+5=6,小于9,将i右移动到下一个不同的值(比如此时nums[2]、nums[3]均为2,如果i=2满足要求,那么i=3时也满足要求,题目要求索引和的最小值,所以要尽可能选则索引小的值,这里就需要保证前面的2的索引是小于后面的2的索引的
在这里插入图片描述
此时和为7,还是小于9,继续将i右移动到下一个不同的值
在这里插入图片描述

此时和为9满足条件,将此时的i,j,k存下来
依次类推,再考虑k=2,i=3,j=len-1的情况。
以上思路基本能够找到三个不同的数,让它们的和等于给定的数,和题目在以下方面还有出入:

  1. 题目要求输出索引和最小的组合
  2. 输出的顺序需要于输入的顺序一致

要解决上面两个问题,只需要新建一个对象House,有两个属性:值和索引。如果我们把输入的nums转为List < House > houses,因为需要将nums按照值的升序排序,所以house可以实现Comparable接口,它按照值的升序排序,当值相等时,应该按照索引的升序排序(当出现两个相同的数,保证前面值的索引小于后面值的索引),houses中存放了索引信息,可以供后续比较得到最小的索引和;而针对“输出的顺序需要于输入的顺序一致”,当我们找到满足条件的组合时,我们再按照对象中存放的索引重新按照从小到大排序即可。

题解

回溯法

package hwod;

import java.util.*;

public class JumpHouse {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        sc.nextLine();
        String str = sc.nextLine();
        int[] nums = Arrays.stream(str.substring(1, str.length() - 1).split(",")).mapToInt(Integer::parseInt).toArray();
        int[] res = jumpHouse(nums, count);
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < res.length; i++) {
            if (i != 0) sb.append(",");
            sb.append(res[i]);
        }
        sb.append("]");
        System.out.println(sb);
    }

    private static List<Integer> res = new ArrayList<>();
    private static int minestIndex = Integer.MAX_VALUE;

    private static int[] jumpHouse(int[] nums, int count) {
        LinkedList<Integer> path = new LinkedList<>();
        dfs(nums, 0, path, count, 0);
        return res.stream().mapToInt(i -> i).toArray();

    }

    private static void dfs(int[] nums, int start, LinkedList<Integer> path, int target, int indexSum) {
        if (path.size() == 3) {
            if (target == 0 && indexSum < minestIndex) {
                minestIndex = indexSum;
                res = new ArrayList<>(path);
            }
            return;
        }
        for (int i = start; i < nums.length; i++) {
            path.addLast(nums[i]);
            dfs(nums, i + 1, path, target - nums[i], indexSum + i);
            path.removeLast();
        }
    }
}

双指针

package hwod;

import java.util.*;

public class JumpHouse2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        sc.nextLine();
        String str = sc.nextLine();
        int[] nums = Arrays.stream(str.substring(1, str.length() - 1).split(",")).mapToInt(Integer::parseInt).toArray();

        List<House> houses = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            houses.add(new House(i, nums[i]));
        }

        int[] res = jumpHouse(houses, count);
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < res.length; i++) {
            if (i != 0) sb.append(",");
            sb.append(res[i]);
        }
        sb.append("]");
        System.out.println(sb);
    }



    private static int[] jumpHouse(List<House> houses, int count) {
        Collections.sort(houses);
        int[] res = new int[3];
        int minIdxSum = Integer.MAX_VALUE;
        for (int k = 0; k < houses.size()-2; k++) {
            if(houses.get(k).getVal()>count) break;
            if(k>0&&houses.get(k).getVal()==houses.get(k-1).getVal()) continue;
            int i = k + 1, j = houses.size() - 1;
            while (i < j) {
                int sum = houses.get(k).getVal() + houses.get(i).getVal() + houses.get(j).getVal();
                if (sum < count) {
                    while (i<j&&houses.get(i).getVal()==houses.get(++i).getVal());
                } else if (sum > count) {
                    while (i<j&&houses.get(j).getVal()==houses.get(--j).getVal());
                } else {
                    int idxSum=houses.get(k).getId() + houses.get(i).getId() + houses.get(j).getId();
                    if (idxSum < minIdxSum) {
                        minIdxSum = idxSum;
                        List<House> houseAns = Arrays.asList(houses.get(k), houses.get(i), houses.get(j));
                        houseAns.sort(Comparator.comparingInt(House::getId));
                        res = new int[]{houseAns.get(0).getVal(), houseAns.get(1).getVal(), houseAns.get(2).getVal()};
                    }
                    while (i<j&&houses.get(i).getVal()==houses.get(++i).getVal());
                    while (i<j&&houses.get(j).getVal()==houses.get(--j).getVal());
                }
            }
        }
        return res;

    }


}

class House implements Comparable<House> {
    private int id;
    private int val;

    public House(int id, int val) {
        this.id = id;
        this.val = val;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getVal() {
        return val;
    }

    public void setVal(int val) {
        this.val = val;
    }

    /**
     * 自定义排序,按照val倒序,索引升序排列,保证去重时始终选的较小值的索引
     * @param o the object to be compared.
     * @return
     */
    @Override
    public int compareTo(House o) {
        if(o.val==this.val) return this.getId() - o.getId();
        return this.val - o.val;
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

外部网关协议_边界网关协议BGP

一.边界网关协议BGP的基本概念 边界网关协议(Border Gateway Protocol&#xff0c;BGP&#xff09;属于外部网关协议EGP这个类别&#xff0c;用于自治系统AS之间的路由选择协议。由于在不同AS内度量路由的“代价”(距离、带宽、费用等&#xff09;可能不同&#xff0c;因此对于…

SQL Server 百万数据查询优化技巧三十则

点击上方蓝字关注我 互联网时代的进程越走越深&#xff0c;使用MySQL的人也越来越多&#xff0c;关于MySQL的数据库优化指南很多&#xff0c;而关于SQL SERVER的T-SQL优化指南看上去比较少&#xff0c;近期有学习SQLSERVER的同学问到SQL SERVER数据库有哪些优化建议&#xff1f…

【基础知识】AB软件RSLinx的版本说明

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 之前对AB的软件了解比较少&#xff0c;在工作中未接触过&#xff0c;最近一次现场勘察时&#xff0c;有很多中控系统都是AB的&#xff0c;借此机会对AB软件有了些许了解。 一、RSLinx是什么软件&#xff1f; RSLinx是…

微服务实战系列之签名Sign

前言 昨日恰逢“小雪”节气&#xff0c;今日寒风如约而至。清晨的马路上&#xff0c;除了洋洋洒洒的落叶&#xff0c;就是熙熙攘攘的上班族。眼看着&#xff0c;暖冬愈明显了&#xff0c;叶子来不及泛黄就告别了树。变化总是在不经意中发生&#xff0c;容不得半刻糊涂。 上集博…

洛谷 P1883 函数

P1883 函数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Error Curves - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这两题是一模一样的&#xff0c;过一题水两题。 分析 主要难点在于证明F(x)是一个单峰函数可以被三分&#xff0c;但是我随便画了几个f(x)之后发现好像…

2023人形机器人行业海外科技研究:从谷歌看机器人大模型进展

今天分享的是人形机器人系列深度研究报告&#xff1a;《2023人形机器人行业海外科技研究&#xff1a;从谷歌看机器人大模型进展》。 &#xff08;报告出品方&#xff1a;华鑫证券&#xff09; 报告共计&#xff1a;26页 大模型是人形机器人的必备要素 长期来看&#xff0c;人…

大数据分析与应用实验任务九

大数据分析与应用实验任务九 实验目的 进一步熟悉pyspark程序运行方式&#xff1b; 熟练掌握pysaprkRDD基本操作相关的方法、函数&#xff0c;解决基本问题。 实验任务 进入pyspark实验环境&#xff0c;打开命令行窗口&#xff0c;输入pyspark&#xff0c;完成下列任务&am…

Vue3中如何响应式解构 props

目录 1&#xff0c;前言2&#xff0c;解决2.1&#xff0c;利用插件&#xff0c;实现编译时转换2.2&#xff0c;toRef 和 toRefs 1&#xff0c;前言 Vue3 中为了保持响应性&#xff0c;始终需要以 props.x 的方式访问这些 prop。这意味着不能够解构 defineProps 的返回值&#…

linux的基础命令

文章目录 linux的基础命令一、linux的目录结构&#xff08;一&#xff09;Linux路径的描述方式 二、Linux命令入门&#xff08;一&#xff09;Linux命令基础格式 三、ls命令&#xff08;一&#xff09;HOME目录和工作目录&#xff08;二&#xff09;ls命令的参数1.ls命令的-a选…

ChatGLM2-6B微调过程说明文档

参考文档&#xff1a; ChatGLM2-6B 微调(初体验) - 知乎 环境配置 下载anaconda&#xff0c;版本是Anaconda3-2023.03-0-Linux-x86_64.sh&#xff0c;其对应的python版本是3.10&#xff0c;试过3.7和3.11版本的在运行时都报错。 执行下面的命令安装anaconda sh Anaconda3-202…

Django之Cookie与Session,CBV加装饰器

前言 会话跟踪技术 在一个会话的多个请求中共享数据&#xff0c;这就是会话跟踪技术。例如在一个会话中的请求如下&#xff1a;  请求银行主页&#xff1b; 请求登录&#xff08;请求参数是用户名和密码&#xff09;&#xff1b;请求转账&#xff08;请求参数与转账相关的数…

winlogbeat采集windows日志

下载链接 https://www.elastic.co/cn/downloads/past-releases/winlogbeat-7-16-2 配置文件 # ---------------------------- Elasticsearch Output ---------------------------- output.elasticsearch:# Array of hosts to connect to.hosts: ["192.168.227.160:9200&…

wagtail-安装配置

系列文章目录 文章目录 系列文章目录安装虚拟环境安装wagtail查看安装后的包 创建wagtail项目安装依赖迁移创建超级用户运行项目 安装虚拟环境 https://blog.csdn.net/gsl371/article/details/117917857 安装wagtail (wagenv) C:\djproject\wagprj>pip list Package V…

Mac下载的软件显示文件已损坏,如何解决文件已损坏问题,让文件可以正常运行

Mac下载的软件显示文件已损坏&#xff0c;如何解决文件已损坏问题&#xff0c;让文件可以正常运行 设备/引擎&#xff1a;Mac&#xff08;11.6&#xff09;/Mac Mini 开发工具&#xff1a;终端 开发需求&#xff1a;让显示已损坏的文件顺利安装到电脑 大家肯定都遇到过下载…

geoserver发布tif矢量数据图层

cesium加载上传至geoserver的tif矢量数据_cesium加载tiff-CSDN博客 geoserver安装及跨域问题解决方案&#xff1a;geoserver安装及跨域问题解决方案_geoserver 跨域_1 1王的博客-CSDN博客 将TIF上传至geoserver 启动geoserver服务&#xff0c;并进入geoserver主页。 1. 新建…

【Java 进阶篇】Redis持久化之RDB:数据的安全守护者

Redis&#xff0c;作为一款高性能的键值存储系统&#xff0c;支持多种持久化方式&#xff0c;其中RDB&#xff08;Redis DataBase&#xff09;是其最常用的一种。RDB可以将当前时刻的数据快照保存到磁盘&#xff0c;以便在Redis重启时快速恢复数据。本文将深入探讨RDB的原理、配…

走近科学之《MySQL 的秘密》

走近科学之《MySQL 的秘密》 mysql 存储引擎、索引、执行计划、事务、锁、分库分表、优化 1、存储引擎&#xff08;storage engines&#xff09; 存储引擎规定了数据存储时的不同底层实现&#xff0c;如存储机制、索引、锁、事务等。 可以通过 show engines 命令查看当前服务…

web前端之若依框架图标对照表、node获取文件夹中的文件名,并通过数组返回文件名、在html文件中引入.svg文件、require、icon

MENU 前言效果图htmlJavaScripstylenode获取文件夹中的文件名 前言 需要把若依原有的icon的svg文件拿到哦&#xff01; 注意看生成svg的路径。 效果图 html <div id"idSvg" class"svg_box"></div>JavaScrip let listSvg [404, bug, build, …

TypeScript 学习笔记 第三部分 贪吃蛇游戏

尚硅谷TypeScript教程&#xff08;李立超老师TS新课&#xff09; 1. 创建开发环境 创建工程&#xff0c;使用学习笔记的第二部分安装css部分 npm i -D less less-loader css-loader style-loader对css部分处理&#xff0c;能够运行在低版本浏览器 npm i -D postcss postcss…

【Docker】从零开始:9.Docker命令:Push推送仓库(Docker Hub,阿里云)

【Docker】从零开始&#xff1a;9.Docker命令:Push推送仓库 知识点1.Docker Push有什么作用&#xff1f;2.Docker仓库有哪几种2.1 公有仓库2.2 第三方仓库2.3 私有仓库2.4 搭建私有仓库的方法有哪几种 3.Docker公有仓库与私有仓库的优缺点对比 Docker Push 命令标准语法操作参数…