找终点
题目描述
给定一个正整数数组,设为nums,最大为100个成员,求从第一个成员开始,正好走到数组最后一个成员,所使用的最少步骤数。
要求:
- 第一步必须从第一元素开始,且1<=第一步的步长<len/2;(len为数组的长度,需要自行解析)。
- 从第二步开始,只能以所在成员的数字走相应的步数,不能多也不能少, 如果目标不可达返回-1,只输出最少的步骤数量。
- 只能向数组的尾部走,不能往回走。
输入描述
由正整数组成的数组,以空格分隔,数组长度小于100,请自行解析数据数量。
输出描述
正整数,表示最少的步数,如果不存在输出-1
用例
输入 | 7 5 9 4 2 6 8 3 5 4 3 9 |
输出 | 2 |
说明 | 第一步: 第一个可选步长选择2,从第一个成员7开始走2步,到达9; 第二步: 从9开始,经过自身数字9对应的9个成员到最后。 |
输入 | 1 2 3 7 1 5 9 3 2 1 |
输出 | -1 |
说明 | 无 |
源码和解析
解析:
- 理解题目
- 通过不断地切换第一步的步数,来找到步数最少且刚好达到末尾
示例代码:
import java.util.ArrayList;
import java.util.List;
public class T48 {
public static boolean flag;// 是否存在 默认为false
public static void main(String[] args) {
String input = "1 2 3 7 1 5 9 3 2 1 2"; // "1 2 3 7 1 5 9 3 2 1";//
// "7 5 9 4 2 6 8 3 5 4 3 9";
List<Integer> nums = new ArrayList<Integer>();
for (String str : input.split(" ")) {
nums.add(Integer.parseInt(str));
}
System.out.println(nums);
int res = dfs(nums);
if (flag)
System.out.println("结果为:" + res);
if (!flag)
System.out.println("结果为:-1");
}
public static int dfs(List<Integer> nums) {
int objCount = nums.size();// 步数数量
int stype = 0;// 第几步
if (nums.get(0) <= 0) {// 第一个数 可能 负数或0 那么步子无法迈出去
return -1;
}
for (stype = 1; stype < nums.size() / 2; stype++) {
boolean f = false;// 第一步位stype 看下是否能移动到nums的最后一个成员
int tempStype = stype;
int index = 0;// 移动的索引
int count = 0;// 一开始就第一步 后面每挪动一次就加1
int tempCount = 0;
while (tempStype < nums.size()) {
index += tempStype;
// System.out.println("index:"+index+" tempStype:"+tempStype);;
count++;
if (index == nums.size() - 1) {
tempCount = count;
// System.out.println("找到了,第一步为" + stype+"步数为"+count);
f = true;
} else if (index < nums.size()) {
tempStype = nums.get(index);
} else {
// 越界了 没找到
break;
}
}
if (f) {
flag = true;
if (objCount > tempCount) {
objCount = tempCount;
}
}
}
return objCount;
}
}
代码运行示意图