L8.5 - 数学专题:杨辉三角的编程妙用(拓展)
L8.5 - 数学专题:杨辉三角的编程妙用(拓展)
一、杨辉三角是什么?
1. 数字金字塔
外观特点:
每一行数字左右对称,像金字塔一样逐层增加
第n行有n个数字,首尾都是1,中间数字=上层两数之和
示例(前5行):
12345 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
二、用C++生成杨辉三角
1. 二维数组生成法
1234567891011121314151617181920212223242526#include <iostream>#include <vector>using namespace std;vector<vector<int>> generatePascal(int n) { vector<vector<int>> triangle(n); for(int i=0; i<n; i++) { triangle[i].resize(i+1, 1); // 每行初始化为1 ...
L8.4 - 二分查找、排列组合与质数筛法深度解析(拓展)
L8.4 - 二分查找、排列组合与质数筛法深度解析(拓展)
🎯 教学目标
掌握二分查找核心原理:理解边界控制与时间复杂度
精通排列组合生成算法:实现高效无重复的排列组合
理解质数筛法机制:掌握埃氏筛与欧拉筛的优化方法
开发高效算法思维:应对复杂问题的解决方案
📚 核心算法原理
一、二分查找(Binary Search)
1. 算法框架
12345678910111213template<typename T>int binarySearch(const vector<T>& arr, T target) { int left = 0, right = arr.size() - 1; // 闭区间 while(left <= right) { // 终止条件 int mid = left + (right - left)/2; // 防止溢出 if(arr[mid] == target) return mid; if(arr[mid] ...
L8.3 - 堆栈内存分配深度解析(拓展)
L8.3 - 堆栈内存分配深度解析(拓展)
🎯 教学目标
掌握内存布局原理:理解栈、堆、静态区的存储机制
精通动态内存管理:深入理解new/delete的底层实现
规避内存操作陷阱:识别常见内存错误模式
优化内存使用效率:掌握内存池等高级技巧
📚 核心知识点
一、内存区域全景图
graph TD
A[内存布局] --> B[栈区 Stack]
A --> C[堆区 Heap]
A --> D[静态/全局区]
A --> E[常量区]
A --> F[代码区]
B --> B1(自动管理)
B --> B2(LIFO结构)
B --> B3(大小受限)
C --> C1(手动管理)
C --> C2(随机访问)
C --> C3(大容量)
二、栈内存 vs 堆内存对比
特性
栈内存
堆内存
管理方式
编译器自动管理
程序员手动管理
分配速度
纳秒级(移动栈指针 ...
L8.2 - 递归&指针深度解析(拓展)
L8.2 - 递归&指针深度解析(拓展)
🎯 教学目标
掌握递归核心原理:理解调用栈机制与递归三要素
精通指针操作技巧:从内存层面理解程序运行机制
规避递归与指针陷阱:识别常见错误模式
开发复杂数据结构:实现链表、树等递归结构
📚 核心知识点
一、递归核心原理
1. 递归三要素
12345678910int factorial(int n) { // 终止条件 if(n == 0) return 1; // 要素1:基准情形 // 递归调用 int prev = factorial(n-1); // 要素2:递归推进 // 状态合并 return n * prev; // 要素3:问题分解}
二、指针操作全景
1. 指针类型体系
类型
示例
内存示意图
裸指针
int* p = &a;
[a地址] → 42
双指针
int** pp = &p;
[pp地址] → [p地址] → 42
函数指针
void (*f ...
L8.1 - 位运算深度解析(拓展)
L8.1 - 位运算深度解析(拓展)
🎯 教学目标
掌握位运算的底层原理:理解二进制位的操作机制
熟练应用位操作技巧:提升算法效率与内存利用率
规避常见位操作陷阱:识别并修复典型错误
开发位运算思维:将位操作融入程序设计
📚 核心知识点
一、基础位运算符表
运算符
名称
示例
二进制运算说明
应用场景
&
按位与
0b1100 & 0b1010 = 0b1000
同1为1
掩码操作、奇偶判断
|
按位或
0b1100 | 0b1010 = 0b1110
有1为1
位标记合并
^
按位异或
0b1100 ^ 0b1010 = 0b0110
不同为1
数值交换、加密
~
按位取反
~0b0011 = 0b1100
0变1,1变0
补码运算
<<
左移
0b0011 << 2 = 0b1100
高位丢弃,低位补0
快速乘2^n
>>
右移
0b1100 >> 2 = 0b0011
低位丢弃,高位补符号位
快速除2^n
二、位操作进阶技巧
1. 状态压缩(State Compr ...
L8 - 高阶算法与数论专题
L8 - 高阶算法与数论专题
🎯 教学目标
掌握二分答案的复杂场景应用
建立递推思维解决组合数学问题
实现高效质数筛法优化算法性能
融合多知识点解决综合性难题
🔑 核心知识点
一、二分答案升级(复杂条件验证)
典型问题:最小化最大值问题
模板代码:
1234567double left=MIN, right=MAX;for(int i=0; i<100; i++) { // 精度控制替代传统终止条件 double mid = (left + right) / 2; if(check(mid)) right = mid; // check函数复杂度可突破 else left = mid;}// 最终答案保留4位小数:printf("%.4f", left);
应用场景:
木棍切割最大长度
最小化机器人移动距离
二、递推与组合数学
1. 递推公式推导
1234// 斐波那契数列f[0] = 0, f[1] = 1;for(int i=2; i<=n; i++) f[i] = f[i-1] + f ...
L7 - 算法优化与高效问题求解
L7 - 算法优化与高效问题求解
🎯 教学目标
掌握时间复杂度分析方法,能估算程序性能并优化算法
熟练应用前缀和技巧,解决区间统计类问题
深入理解二分法,实现查找与答案判定双重功能
构建递归思维模型,学会用记忆化搜索优化重复计算
📚 核心知识体系
一、时间复杂度分析(理论基石)
123456789// 示例:比较两种算法的耗时差异void algo_O_n(int n) { // O(n) for(int i=0; i<n; i++) { /* 操作 */ }}void algo_O_n2(int n) { // O(n²) for(int i=0; i<n; i++) for(int j=0; j<n; j++) { /* 操作 */ }}
复杂度对比表
数据规模
O(n)(毫秒)
O(n²)(毫秒)
n=1e3
1
1000
n=1e4
10
100000
二、前缀和与差分数组(区间处理利器)
1. 一维前缀和模板
12 ...
L6.1 - 指针与动态内存(拓展)
L6.1 - 指针与动态内存(拓展)
🎯 教学目标
掌握指针运算与内存地址操作
熟练使用new/delete管理动态内存
理解智能指针的工作原理
掌握函数指针的高级应用
预防内存泄漏与悬空指针问题
🔑 核心知识点
1. 指针基础概念
内存地址可视化模型
1230x1000 [ 10 ] ← int a = 100x1004 [ 0x1000 ] ← int* p = &a0x1008 [ 0x1004 ] ← int** pp = &p
指针声明三要素:
123int* p; // 声明指针变量p = &a; // 取地址操作cout << *p; // 解引用操作
指针运算原理
123456int arr[5] = {10,20,30,40,50};int* ptr = arr;ptr + 1 → 地址增加sizeof(int)(通常4字节)*(ptr+3) ← 等价于arr[3]ptr++ ← 移动到下一个元素
2. 动态内存管理
内存分配生命周期图
1234┌──────── ...
L6 - 算法优化与多维数组
L6 - 算法优化与多维数组
📚 核心知识模块
graph TB
L6[L6 算法与多维数组]
L6 --> A[排序算法]
L6 --> B[循环优化]
L6 --> C[STL函数]
L6 --> D[二维数组]
A --> A1(冒泡排序)
A --> A2(计数排序)
A --> A3(算法对比)
B --> B1(循环嵌套)
B --> B2(流程控制)
C --> C1(sort)
C --> C2(swap)
C --> C3(数学函数)
D --> D1(动态创建)
D --> D2(矩阵运算)
🔥 重点升级内容
1. 排序算法深度对比
冒泡排序模板
123456789101112void bubbleSort(int arr[], int n) { for(int i=0; i<n-1 ...
L5 - 函数与递归
L5 - 函数与递归
🎯 教学目标深化
函数设计原则
单一职责原则(每个函数只做一件事)
合理控制函数体长度(建议不超过50行)
避免函数副作用(除非明确需要)
递归思维训练
分治思想的实现方式
递归树分析(用于理解递归执行路径)
递归与数学归纳法的关系
🔑 核心知识点扩展
1. 函数定义深度解析
函数声明与定义的分离
123456789// mymath.h(头文件)#pragma onceint add(int a, int b); // 声明// mymath.cpp(源文件)#include "mymath.h"int add(int a, int b) { // 定义 return a + b;}
头文件作用:
提供接口文档
避免重复定义
支持模块化编译
默认参数机制
1234567void printLog(string msg, int level=1) { cout << "[" << level << "] &quo ...