题目描述
跳房子,也叫跳飞机,是一种世界性的儿童游戏。
游戏参与者需要分多个回合按顺序跳到第1格直到房子的最后一格。
跳房子的过程中,可以向前跳,也可以向后跳。
假设房子的总格数是count,小红每回合可能连续跳的步教都放在数组steps中,请问数组中是否有一种步数的组合,可以让小红两个回合跳到量后一格?
如果有,请输出索引和最小的步数组合。
注意:
- 数组中的步数可以重复,但数组中的元素不能重复使用。
- 提供的数据保证存在满足题目要求的组合,且索引和最小的步数组合是唯一的。
输入描述
第一行输入为房子总格数count,它是int整数类型。
第二行输入为每回合可能连续跳的步数,它是int整数数组类型。
输出描述
返回索引和最小的满足要求的步数组合(顺序保持steps中原有顺序)
备注
- count ≤ 1000
- 0 ≤ steps.length ≤ 5000
- -100000000 ≤ steps[i] ≤ 100000000
用例
输入 | [1,4,5,2,2] 7 |
输出 | [5, 2] |
说明 | 无 |
输入 | [-1,2,4,9,6] 8 |
输出 | [-1, 9] |
说明 | 此样例有多种组合满足两回合跳到最后,譬如:[-1,9],[2,6],其中[-1,9]的索引和为0+3=3,[2,6]的索和为1+4=5,所以索引和最小的步数组合[-1,9] |
题目解析
本题其实就是两数之和:的变种题。
即有一个数组steps,要在其中找到一个二元组,让其和等于count。
和leetcode两数之和的区别在于,本题最终解二元组可能有多个解,我们需要在这多个解中找到索引和最小的作为最终解,即我们不仅要求二元组元素之和,还要求二元组索引之和。
本题解析可以参考上面链接博客。
2023.08.24
新增一个用例
[1,2,9,9,9,1,9,9,3,2]
4
我们需要注意的是,第二个1的索引要大于第一个1的索引,因此后面遇到3时,我们应该让3和第一个1进行匹配,而不是第二个1。
对应逻辑在:
JS:41~43行
Java:39行
Python:19行
JS算法源码
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
const steps = JSON.parse(await readline());
const count = parseInt(await readline());
console.log(getResult(steps, count));
})();
function getResult(steps, count) {
const map = {};
let minIdxSum = Infinity;
let ans = "";
for (let idx1 = 0; idx1 < steps.length; idx1++) {
const step1 = steps[idx1];
const step2 = count - step1;
if (map[step2] != undefined) {
const idx2 = map[step2];
const idxSum = idx1 + idx2;
if (idxSum < minIdxSum) {
minIdxSum = idxSum;
ans = `[${step2}, ${step1}]`;
}
} else {
if (map[step1] == undefined) {
map[step1] = idx1;
}
}
}
return ans;
}
Java算法源码
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String tmp = sc.nextLine();
int[] steps =
Arrays.stream(tmp.substring(1, tmp.length() - 1).split(","))
.mapToInt(Integer::parseInt)
.toArray();
int count = Integer.parseInt(sc.nextLine());
System.out.println(getResult(steps, count));
}
public static String getResult(int[] steps, int count) {
HashMap<Integer, Integer> map = new HashMap<>();
int minIdxSum = Integer.MAX_VALUE;
String ans = "";
for (int idx1 = 0; idx1 < steps.length; idx1++) {
int step1 = steps[idx1];
int step2 = count - step1;
if (map.containsKey(step2)) {
int idx2 = map.get(step2);
int idxSum = idx1 + idx2;
if (idxSum < minIdxSum) {
minIdxSum = idxSum;
ans = "[" + step2 + ", " + step1 + "]";
}
} else {
map.putIfAbsent(step1, idx1);
}
}
return ans;
}
}
Python算法源码
# 输入获取
import sys
steps = list(map(int, input()[1:-1].split(",")))
count = int(input())
# 算法入口
def getResult():
dic = {}
minIdxSum = sys.maxsize
ans = ""
for idx1 in range(len(steps)):
step1 = steps[idx1]
step2 = count - step1
if dic.get(step2) is None:
dic.setdefault(step1, idx1)
else:
idx2 = dic[step2]
idxSum = idx1 + idx2
if idxSum < minIdxSum:
minIdxSum = idxSum
ans = f"[{step2}, {step1}]"
return ans
# 算法调用
print(getResult())
C算法源码
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0