题目描述
一个正整数数组 设为nums
最大为100个成员
求从第一个成员开始正好走到数组最后一个成员所使用的最小步骤数
3 5 9 4 2 6 8 3 5 4 3 9
要求:
1. 第一步 必须从第一元素起 且 1<=第一步步长<len/2 (len为数组长度)
2. 从第二步开始只能以所在成员的数字走相应的步数,不能多不能少,
如果目标不可达返回-1。
只输出最小的步骤数量
3. 只能向数组的尾部走不能向回走。
输入描述
有正整数数组 空格分割
数组长度<100。
输出描述
正整数 最小步数
不存在输出-1。
示例1
输入
7 5 9 4 2 6 8 3 5 4 3 9
输出
2
说明:第一个可选步长选择2
从第一个成员7开始走两步到9
第二步:从9经过9个成员到最后。
示例2
输入
1 2 3 7 1 5 9 3 2 1
输出
-1
说明:不存在输出-1。
思路分析
- 1<=第一步步长<len/2 (len为数组长度),需要遍历第一步的各种可能。
- 从第二步开始只能以所在成员的数字走相应的步数,不能多不能少。
- 只能向数组的尾部走不能向回走。
参考代码
注:题目网上找的,参考代码是练习用,仅供参考,并不保证用例通过率。
import java.util.Scanner;
/**
* 最小步骤数
*/
public class Test0018 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] numsStr = scanner.nextLine().split(" ");
int len = numsStr.length;
int[] nums = new int[len];
for (int i = 0; i < len; i++) {
nums[i] = Integer.parseInt(numsStr[i]);
}
int minCount = 0;
// 第一步最多只能走 len/2,遍历各种情况
for (int i = 1; i < len / 2; i++) {
// 走出第一步后的步数和位置
int count = 1;
int index = i;
// 从第二步开始只能以所在成员的数字走相应的步数
while (true) {
// 再走一步
index += nums[index];
// 步数加1
count++;
if (index > len - 1) {
// 当走的长度超出了范围,说明这种情况不符合要求
break;
} else if (index == len - 1) {
// 刚好走到最后一个成员,更新最小步数
if (minCount == 0) {
minCount = count;
} else {
minCount = Math.min(minCount, count);
}
break;
}
}
}
if (minCount == 0) {
System.out.println(-1);
} else {
System.out.println(minCount);
}
}
}