问:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
解:推导出递推公式后,编程时自底向上型循环求解,时间复杂度为O(n),空间复杂度为O(3) 。
public class Solution {
public int jumpFloor(int target) {
if (target <= 1)
return 1;
// fn表示第f[n]项, fn1表示第 f[n-1] 项, fn2表示f[n-2]项
int fn=1, fn1=1, fn2=1;
for (int i=2; i<=target; i++) {
fn = fn1 + fn2;
// 为下一次循环求 f[i + 1] 做准备
fn2 = fn1;
fn1 = fn;
}
return fn;
}
}
问:冒泡排序和快速排序。
解:时间复杂度分别为O(n的平方)和O(nlogn)。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型一维数组 待排序的数组
* @return int整型一维数组
*/
public int[] MySort (int[] arr) {
// 冒泡排序
// int size = arr.length;
// for (int i=1; i<size-1; i++) {
// int temp;
// for (int j=0; j<size-i; j++) {
// if (arr[j] > arr[j+1]) {
// temp = arr[j];
// arr[j] = arr[j+1];
// arr[j+1] = temp;
// }
// }
// }
// 快速排序
quickSort_rec(arr, 0, arr.length-1);
return arr;
}
public static void quickSort_rec(int[] arr, int left, int right) {
if (left >= right)
return;
int point = quickSort_exc(arr, left, right);
quickSort_rec(arr, left, point-1);
quickSort_rec(arr, point+1, right);
}
public static int quickSort_exc(int[] arr, int i, int j) {
int k = i;
int temp;
while (i<j) {
while (i<j && arr[j]>=arr[k])
j--;
while (i<j && arr[i]<=arr[k])
i++;
temp=arr[j];arr[j]=arr[i];arr[i]=temp;
}
temp=arr[i];arr[i]=arr[k];arr[k]=temp;
return i;
}
}