题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路分析:
对于本题,前提只有 一次 1阶或者2阶的跳法。设总的跳法是f(n)
a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);
b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)
c.由a\b假设可以得出总跳法为: f(n) = f(n-1) + f(n-2)
d.然后通过实际的情况可以得出:只有一阶的时候 f(1) = 1 ,只有两阶的时候可以有 f(2) = 2
e.可以发现最终得出的是一个斐波那契数列:
另:也可通过找规律的方法得出f(1)=1,f(2)=2,f(3)=3,f(4)=5,总结得出f(n)=f(n-1)+f(n-2)
所以,该题和com.hwx.swordToOffer._07_Fibonacci本质是一样的,即为输出第n个斐波那契序列,用循环不用递归
package com.hwx.swordToOffer._08_JumpFloor;
public class Solution {
static int count = 0;// 表示共有多少种方式
public static void main(String[] args) {
System.out.println(JumpFloor(4));
}
/*
* 更好更准确的方式,斐波那契序列,循环迭代法
*/
public static int JumpFloor(int target) {
if (target <= 0) {
return 0;
}
if (target <= 2) {
return target;// target为1时结果是1,为2时结果是2
}
int prePreJump =1;
int preJump = 2;
int result = 0;
for (int i = 3; i <= target; i++) {
result = prePreJump + preJump;
prePreJump=preJump;
preJump=result;
}
return result;
}
/*
* 我的方式,不大好觉得
*/
public static int JumpFloor2(int target) {
// 到最后一步,只有剩余1个台阶或剩余0个台阶,不能再分解,直接count+1;
// 如果还有2,则不能直接+1,因为2还是可以继续分解递归
if (target == 1 || target == 0) {
count++;
} else {// 否则递归,分为两种递归
JumpFloor(target - 1);
JumpFloor(target - 2);
}
return count;
}
}