蓝桥杯高频知识点补缺

这篇文章用于记录蓝桥杯刷题过程中遇到的高频且难的知识点,会不断更新。

一.动态规划

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博客

三.前缀和,差分数组

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值