问题描述
public static int jump(int distance,int range1,int range2){
int res = 0,counter = 0;
range1 + range1 + range1 + range1
counter = range1 + jump(distance,range1,range2) == distance ?
if ( range1 + jump(distance,range2) == distance ){
counter++;
} else if ( )
range1 + range1 + range2
range2 + range1 + range1
range2 + range2
return counter;
}
此功能的示例和说明:
方法调用: jump(4,1,2);
输出: 5
该函数在后台应执行的操作 1 + 1 + 1 + 1
1 + 1 + 2
1 + 2 + 1
2 + 1 + 1
2 + 2
因此,它最终能够以不同的方式将步骤1和步骤2相加5次,然后应该return 5
。
解决方法
我们可以进行jump(3,1,2)
的递归调用
jump(3,2)
/ \
jump(2,2) jump(1,2)
/ \ /
jump(1,2) jump(0,2) jump(0,2)
/
jump(0,2)
注意:我们能够准确地到达jump(0,2)
3次,因此答案是3。
在每个函数调用中,我们需要处理以下三种情况之一:
情况1:当距离小于0时,这意味着未选择确切的步长,因此我们不计算此路径并返回0
情况2:当距离精确为0时,表示选择了精确的步长,我们返回1
情况3:当距离大于或等于step1或step2时,我们进行递归调用,这是选择step1和step2的总和。
class Solution {
public static int jump(int distance,int a,int b) {
if(distance < 0) return 0; // case 1
if(distance == 0) return 1; // case 2
return jump(distance - a,a,b) + jump(distance - b,b); // case 3
}
public static void main(String[] args) {
System.out.println(jump(3,2));
}
}
output: 2