【华为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-排列组合】一个套路速解排列组合题

先只考虑三数之和等于目标值,比如对于:-4 -1 -1 0 1 2 5,目标和为0
回溯遍历过程:
-4 -1 -1
-4 -1 0
-4 -1 1
-4 -1 2
-4 -1 5
-1 -1 0
-1 -1 1
-1 -1 2
-1 -1 5
0 1 2
0 1 5
1 2 5
设第一二三位分别为i,j,k,当i固定为-4,j固定位-1时,需要找的目标数字是5(加起来和才为0),回溯的过程,对于k来说,是依次遍历-1,0,1,2,5,找到最后才出现5,因为数组是按照从小到大排序的,所以可以考虑,最开始k就从最后一位开始找:
如果最后一位都小于5,那么其前面的数字不可能比5还大,也就不必再找-4,-1,?的组合了。
如果最后一位大于5,那么i,j,k这三个数加起来肯定大于0,此时需要将k左移可以使三个数的和相对小一点。
上面的优化过程就是双指针的思想。

双指针

根据上面的分析,回溯法可能会超时,所以推荐双指针法。

比如输入的数组是: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.mzph.cn/news/171556.shtml

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

相关文章

【Docker】从零开始:11.Harbor搭建企业镜像仓库

【Docker】从零开始&#xff1a;11.Harbor搭建企业镜像仓库 1. Harbor介绍2. 软硬件要求(1). 硬件要求(2). 软件要求 3.Harbor优势4.Harbor的误区5.Harbor的几种安装方式6.在线安装(1).安装composer(2).配置内核参数,开启路由转发(3).下载安装包并解压(4).创建并修改配置文件(5…

python+pytest接口自动化(1)-接口测试基础

一般我们所说的接口即API&#xff0c;那什么又是API呢&#xff0c;百度给的定义如下&#xff1a; API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的接口&#xff08;如函数、HTTP接口&#xff09;&#xff0c;或指软件系…

3款免费的语音视频转文本AI神器

最近有很多粉丝让我出一期关于语音转文本的免费AI神器&#xff0c;毕竟这类工具在学习和工作中经常会用到&#xff0c;那今天就给大家安排。 我亲测了好几款软件之后&#xff0c;最终评选留下了三款 剪映hugging face飞书妙记 接下来一一给大家讲解 1.剪映 剪映其实是一款视…

引用、动态内存分配、函数、结构体

引用 定义和初始化 **数据类型 &引用名 目标名;**引用和目标共用同一片空间&#xff08;相当于对一片空间取别名&#xff09;。 引用的底层实现&#xff1a;数据类型 * const p&#xff1b; ------> 常指针 int const *p; -----> 修饰 *p const int *p; ----->…

stm32实现0.96oled图片显示,菜单功能

stm32实现0.96oled图片显示&#xff0c;菜单功能 功能展示简介代码介绍oled.coled.holedfont.h&#xff08;字库文件&#xff09;main函数 代码思路讲解 本期内容&#xff0c;我们将学习0.96寸oled的进阶使用&#xff0c;展示图片&#xff0c;实现菜单切换等功能&#xff0c;关…

QT visual stdio加载动态库报错126问题

报错126是找不到指定的模块 QT 查看构建目录&#xff0c;将依赖的动态库放到该目录下即可成功 visual stdio将依赖的动态库放到运行目录 在vs中使用导出类的动态库时&#xff0c;不但需要将对应的.dll放到对应的目录下&#xff0c;还需要将该动态库对应的.lib添加到如下配置才…

【SAS Planet 下载地图瓦片】

SAS Planet是一位俄罗斯爱好者创建的的开源应用&#xff0c;该应用可以浏览与下载主流网络地图&#xff0c;包括Google地图、Google地球、Bing地图、Esri 地图、Yandex地图等&#xff0c;支持100多图源。 安装包下载地址&#xff1a;https://www.sasgis.org/download/ github…

337. 打家劫舍III (二叉树)

题目 题解 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def rob(self, root: Optional[TreeNode]) ->…

指针的进阶

重中之重&#xff1a; 目录 1.字符指针&#xff1a; 2.指针数组 3.数组指针 4.数组参数、指针参数 5.函数指针 1.字符指针&#xff1a; 一般实现&#xff1a; int main() {char ch w;char *pc &ch;*pc w;return 0; } 二班实现&#xff1a; int main() {const c…

什么是闭包和作用域链?

1. 什么是闭包 闭包指的是那些引用了另一个函数作用域中变量的函数&#xff0c;通常是在嵌套函数中实现的。 举个栗子&#xff0c;createCounter 接受一个参数 n&#xff0c;然后返回一个匿名函数&#xff0c;这个匿名函数是闭包&#xff0c;它可以访问外部函数 createCounte…

智能优化算法应用:基于鲸鱼算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鲸鱼算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鲸鱼算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鲸鱼算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Nginx常见的中间件漏洞

目录 1、Nginx文件名逻辑漏洞 2、Nginx解析漏洞 3、Nginx越权读取缓存漏洞 这里需要的漏洞环境可以看&#xff1a;Nginx 配置错误导致的漏洞-CSDN博客 1、Nginx文件名逻辑漏洞 该漏洞利用条件有两个&#xff1a; Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7 php-fpm.conf中的s…

百度 Comate 终于支持 IntelliJ IDEA 了

大家好&#xff0c;我是伍六七。 对于一直关注 AI 编程的阿七来说&#xff0c;编程助手绝对是必不可少的&#xff0c;除了 GitHub Copilot 之外&#xff0c;国内百度的 Comate 一直是我关注的重点。 但是之前&#xff0c;Comate 还支持 VS code&#xff0c;并不支持 IntelliJ…

mybatis的使用,mybatis的实现原理,mybatis的优缺点,MyBatis缓存,MyBatis运行的原理,MyBatis的编写方式

文章目录 MyBatis简介结构图Mybatis缓存&#xff08;一级缓存、二级缓存&#xff09;MyBatis是什么&#xff1f;mybatis的实现原理JDBC编程有哪些不足之处&#xff0c;MyBatis是如何解决这些问题的&#xff1f;Mybatis优缺点优点缺点映射关系 MyBatis的解析和运行原理MyBatis的…

【单片机学习笔记】STC8H1K08参考手册学习笔记

STC8H1K08参考手册学习笔记 STC8H系列芯片STC8H1K08开发环境串口烧录 STC8H系列芯片 STC8H 系列单片机是不需要外部晶振和外部复位的单片机&#xff0c;是以超强抗干扰/超低价/高速/低功耗为目标的 8051 单片机,在相同的工作频率下,STC8H 系列单片机比传统的 8051约快12 倍速度…

数组题目:645. 错误的集合、 697. 数组的度、 448. 找到所有数组中消失的数字、442. 数组中重复的数据 、41. 缺失的第一个正数

645. 错误的集合 思路&#xff1a; 我们定义一个数组cnt&#xff0c;记录每个数出现的次数。然后我们遍历数组&#xff0c;从1开始&#xff0c;如果cnt[i] 0 那就说明这个是错误的数&#xff0c;如果 cnt[i] 2&#xff0c;那就说明是重复的数。 代码&#xff1a; class So…

RabbitMQ之消费者可靠性

文章目录 前言一、消费者确认机制二、失败重试机制三、失败处理策略四、业务幂等性唯一消息ID业务判断 五、兜底方案总结 前言 当RabbitMQ向消费者投递消息以后&#xff0c;需要知道消费者的处理状态如何。因为消息投递给消费者并不代表就一定被正确消费了&#xff0c;可能出现…

3DMAX平滑布尔插件超级布尔工具使用教程

3dMax平滑布尔插件SmoothBoolean用于在ProBoolean网格之间创建平滑过渡的3dMax插件。再也不需要花几个小时来清理用布尔切割创建的混乱拓扑了。如果你只是想让你的三维模型在渲染图上看起来很棒&#xff0c;或者你需要为游戏烘焙一些东西&#xff0c;那么你就不必浪费时间来建模…

Kotlin学习——kt中的类,数据类 枚举类 密封类,以及对象

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

个人硬件测试用例入门设计

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f324;️功能测试 进行新增、…