这篇文章用于记录蓝桥杯刷题过程中遇到的高频且难的知识点,会不断更新。
一.动态规划
1.爬楼梯问题:(acwing821.跳台阶) (最暴力的dfs -> 记忆化搜索 -> 递推(dp))
假设有n级台阶一次可以走一步或两步,那么从第一阶到第n阶一共有多少种可能。
思路:
从第一阶到第n阶的总次数可以分成第一阶到第n-1阶和第一阶到第n-2阶
代码如下:
import java.util.Scanner;
//假设有n级台阶一次可以走一步或两步,那么从第一阶到第n阶一共有多少种可能
public class dpTest爬楼梯_1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println(dp(n));
}
//从第一阶到第n阶的总次数可以分成第一阶到第n-1阶和第一阶到第n-2阶
public static int dp(int n) {
if(n == 1) {
return 1;
}
else if(n == 2) {
return 2;
}
else {
return dp(n - 1)+ dp(n - 2);
}
}
}
可以用记忆化搜索优化以减少重复计算,代码如下:
import java.util.Scanner;
//用记忆化搜索优化爬楼梯问题
//记忆化搜索是指在递归过程中把子结果的答案存储起来以减少重复计算
public class dpTest爬楼梯_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] mem = new int[n + 1];
System.out.println(dfs(n,mem));
sc.close();
}
//从第一阶到第n阶的总次数可以分成第一阶到第n-1阶和第一阶到第n-2阶
public static int dfs(int n,int[] mem) {
if(mem[n] != 0) {
return mem[n];
}
int sum = 0;
if(n == 1) {
sum = 1;
}
else if(n == 2) {
sum = 2;
}
else {
sum = dfs(n - 1,mem) + dfs(n - 2,mem);
}
mem[n] = sum;//将此轮结果用mem数组记录
return sum;
}
}
对于递归的理解:
递:是将一个问题分解成很多子问题的过程
归:是真正产生答案的过程
递归搜索树的底:是已知最小子问题的答案,可以推出其他子问题的答案
二.HashSet
利用其去重特性可以用来存储不能重复的数据。
原文链接:【Java集合框架】13——HashSet 类-CSDN博客