9,斐波那契数列
要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0),n<=39。
思路:菲波那切数列:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*),就是后一个数字是前两个数字的和。所以for循环应该从2开始遍历到n
public int FIBO(int n) { int a=1,b=a; int temp; if(n<=0) return 0; for(int i=2;i<n;i++) { temp=a; a=b; b=temp+b; } return b; }
6.旋转数组中的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
1,
思路:就是对一个有序数列,从中间拦腰斩断,前后颠倒位置,让他整体没有顺序。从这样一组数列中找最小数就直接依次遍历,
- 当前一个数字比后一个数字大,说明原来数列是递增的,而当前的两个数字一个是原数列尾巴一个是原数列头,所以这个头就是我们要的最小数字。
- 当遍历之后发现前一个数字都比后一个数字小,则说明现在这个数列是递增的,最小值就是第一个元素
public int test1(int[] array) { if(array.length==0) { return 0; } for(int i=0;i<array.length-1;i++) { if(array[i]>array[i+1]) { return array[i+1]; } } return array[0]; }
2,,
二分法
public int test18(int[] array) { if(array.length==0) return 0; int l=0,r=array.length-1,mid=0; while(l<r) { mid=(r+l)/2; if(array[mid]>array[r]) l=mid+1; else r=mid; } return array[l]; }
8.跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路:相当于是斐波那契数列的变式。关于为什么青蛙跳台阶可以认为是斐波那契数列,如下图显示,其中数字代表步数。
递推式:
public int test18(int n) { if(n<=0) return 0; if(n==0) return 1; int a=1,b=1,temp; for(int i=2;i<n;i++) { temp=a; a=b; b=temp+b; } return b; }