【华为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*/@Overridepublic int compareTo(House o) {if(o.val==this.val) return this.getId() - o.getId();return this.val - o.val;}
}

推荐

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【灌水】自动跑团机器人

实现一个自动COC跑团机器人 这几天玩博德之门3有点累了 #假如你有一台服务器&#xff0c;你最想做哪些事&#xff1f;# 这他妈是什么idea收集器&#xff0c;你们就是靠这个收集idea吗&#xff0c;那我就说一个绝对不赚钱的了。 简单实现了追书人的基本流程&#xff0c;最后…

Docker Compose部署微服务项目实战讲解

一、Docker Compose简介 当需要在多个容器之间协调和管理应用程序时&#xff0c;Docker Compose是一个非常有用的工具。它允许通过一个配置文件来定义、配置和启动多个 Docker 容器&#xff0c;使得整个应用程序的部署变得更加简单和一致。以下是 Docker Compose 的一些重要概…

走近科学之《MySQL 的秘密》

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

项目中常用的 19 条 SQL 优化宝典

一、EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。 下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引…

每日一题:LeetCode-105.从前序遍历与中序遍历构造二叉树

每日一题系列&#xff08;day 02&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

常见树种(贵州省):014槭树、梧桐、鹅掌楸、檫木、梓木、油桐、泡桐、川楝、麻楝

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、色木槭…

USB驱动开发基础

USB标准 USB1.0&#xff0c; 1996&#xff0c;低速1.5Mbps和高速12Mbps&#xff0c;USB1.1 iMac G3&#xff0c;Type A和Type B接口USB 2.0 2000&#xff0c; 480Mpbs&#xff0c;Type A/B/C接口、Micro A/BUSB 3.0 5Gbps, 随着USB 3.2命名规定&#xff0c;现在也叫USB 3.2 Ge…

CUDA学习笔记9——CUDA 共享内存 / Shared Memory

由于共享内存拥有仅次于寄存器的读写速度&#xff0c;比全局内存快得多。因此&#xff0c;能够用共享内存访问替换全局内存访问的场景都可以考虑做对应的优化。 不利用共享内存的矩阵乘法 不利用共享内存的矩阵乘法的直接实现。每个线程读取A的一行和B的一列&#xff0c;并计…

mac电脑系统活动监控:iStat Menus 中文 for Mac

iStat Menus是一款Mac操作系统上的系统监控工具&#xff0c;它提供了实时的系统状态和性能数据&#xff0c;让用户可以方便地监控和管理自己的电脑。iStat Menus以菜单栏图标的形式显示各种系统指标&#xff0c;用户可以轻松访问和查看这些信息。 以下是iStat Menus软件的一些…

SpringBoot:异步任务基础与源码剖析

官网文档&#xff1a;How To Do Async in Spring | Baeldung。 Async注解 Spring框架基于Async注解提供了对异步执行流程的支持。 最简单的例子是&#xff1a;使用Async注解修饰一个方法&#xff0c;那么这个方法将在一个单独的线程中被执行&#xff0c;即&#xff1a;从同步执…

windows11上enable WSL

Windows电脑上要配置linux&#xff08;这里指ubuntu&#xff09;开发环境&#xff0c;主要有三种方式&#xff1a; 1&#xff09;在windows上装个虚拟机&#xff08;比如vmware&#xff09;。缺点是vmware加载ubuntu后系统会变慢很多&#xff0c;而且需要通过samba来实现window…

百望云杨正道:数电时代 CFO如何带领企业完成财税数字化转型

百望云杨正道&#xff1a;数电时代 CFO如何带领企业完成财税数字化转型 谁是企业数字化转型的操盘手&#xff1f;数字时代如何通过数智变革帮助企业降本增效&#xff0c;做厚企业价值&#xff1f; 近日&#xff0c;由财能科技主办的“2023财能书院CFO年度论坛”在北京隆重举行…