字典树的基础算法
...
树状数组的原理
...
c语言学习-3
c语言学习-3 前两波我们学习完了c语言的基础语法,接下来我们用一个项目来深入理解所学知识。 项目地址:https://github.com/Sakjijdidji55/Racing-Car/tree/master 项目简介 本项目是一个赛车游戏,玩家通过控制赛车躲避障碍物,最终到达终点。 项目结构 项目包含以下文件: (注:后缀名.cpp是因为项目需引入easyx库文件,.c无法使用这个文件,本项目语法均为c语言风格语法,笔者希望这个项目可以对你有所帮助) main.cpp:主程序文件,只包含main函数。 Body.cpp: 程序主体,包含赛车、障碍物、背景等对象及其处理。 Car.cpp: 赛车对象及其处理。 Coin.cpp: 金币对象及其处理。 RoadLine.cpp: 路线对象及其处理。 Queue.cpp: 自实现循环队列。 image文件夹:存放游戏所需图片资源。 music文件夹:存放游戏所需音乐资源。 游戏原理 如何实现主角也就是我们自己操作的对象的移动效果 1, 路线以及游戏的各种资源向下移动 2,...
c语言学习-2
c语言学习-2 1. 指针 1. 介绍 指针是一个变量,其值为另一个变量的地址,即,指针变量的值就是地址。指针变量声明的一般形式为: 1type *var-name; 其中,type 是指针的基类型,var-name 是指针变量的名称。* 表示这是一个指针变量。 例如,声明一个指向整数类型的指针变量:int *ip; 指针变量的值是一个地址,可以使用 & 运算符获取变量的地址,并将其赋值给指针变量。例如: 123int var = 10;int *ip;ip = &var; 在上述代码中,ip 指向变量 var 的地址。可以使用 * 运算符获取指针变量所指向的值。例如: 12345int var = 10;int *ip;ip = &var;printf("Value of var variable: %d\n", var);printf("Value available at the address stored in ip variable: %d\n", *ip); 输出结果为: 12Value of var...
c语言学习--1
c语言学习–1 欢迎来到c语言学习,本篇是c语言学习的第一篇,主要介绍c语言的基础知识,包括c语言规范 、变量、常量、运算符、控制语句、函数、数组、字符串等。 一,c语言规范 以下是阿里c语言规范 1. 缩进 使用空格进行缩进,每次缩进4个空格 代码块的分界符(如大括号)前后都需要加空格 条件语句、循环语句、函数定义等语句的左大括号前不加空格,右大括号独占一行 12345if (condition) { // do something} else { // do something else} 2. 命名 变量名、函数名、宏定义等遵循驼峰命名法,如myVariable、myFunction、MY_MACRO等 常量名、宏定义等全部大写,单词之间用下划线分隔,如MY_CONSTANT、MAX_VALUE等 函数名和变量名不要使用保留字 12345int myVariable = 10;void myFunction() { // do something}#define MAX_VALUE...
力扣重刷篇--2
我的力扣: 迷路的小朋友 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。 示例 12输入:[1,8,6,2,5,4,8,3,7]输出:49 解题思路 双指针法,从两端开始向中间遍历,每次移动高度较小的指针,直到两个指针相遇。 代码 1234567891011121314151617181920class Solution {public: int maxArea(vector<int>& height) { int ans=0,n=height.size(); for(int i=0;i<n;i++){ if(height[i]<height[n-1]){ ...
力扣重刷篇--1
我的力扣: 迷路的小朋友 力扣重刷篇–1 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 123输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 解题思路 暴力法(O(n^2)):直接两轮for循环遍历数组,找到符合条件的两个数。 哈希表(O(n)):利用哈希表存储数组元素和索引的映射关系,通过一次遍历数组,判断target - nums[i] 是否在哈希表中,如果存在则返回对应的索引。 代码 暴力法: 123456789101112131415class Solution { public int[] twoSum(int[] nums, int target) { int[]...
图--DFS与BFS
图的存储 直接存边(邻接表) 12345678int n,k;cin>>n>>k; // n为顶点数,k为边数vector<vector<int>> graph(n+1, vector<int>()); // n为顶点数for(int i = 0; i < k; i++) { int a, b; cin >> a >> b; graph[a].push_back(b);} 这种方法的优点是简单,但难以判断两个顶点之间是否有边相连。 邻接矩阵 12345678int n, k;cin >> n >> k; // n为顶点数,k为边数vector<vector<int>> graph(n+1, vector<int>(n+1, 0)); // n为顶点数for(int i = 0; i < k; i++) { int a, b; cin >> a...
回溯算法
回溯算法介绍与基本使用 1. 什么是回溯算法? 回溯算法(Backtracking)是一种通过试错来寻找问题解决方案的算法思想。它通过逐步构建候选解,并在确定当前路径无法得到有效解时,回溯到上一步尝试其他可能的路径。回溯算法常用于解决组合优化、排列组合、子集生成等需要遍历所有可能性的问题。 2. 回溯算法的基本思想 试错思想:通过递归或迭代逐步构建候选解 剪枝操作:当发现当前路径不可能得到解时,提前终止该路径 状态管理:在递归过程中维护和恢复状态(通过栈或参数传递) 3. 适用场景 ✅ 组合问题:从n个元素中选k个的所有组合 ✅ 排列问题:全排列、N皇后问题 ✅ 子集问题:求集合的所有子集 ✅ 分割问题:字符串分割为回文子串 ✅ 棋盘问题:数独、单词搜索 4. 算法基本结构 12345678910def backtrack(路径, 选择列表): if 满足结束条件: 结果集.append(路径) return for 选择 in 选择列表: if 不满足剪枝条件: 做选择(加入路径) ...
线段树的概念与算法
前言 线段树是一种二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。线段树具有以下性质: 线段树的每个结点代表一个区间; 线段树的每个叶结点代表一个长度为1的区间; 线段树的每个非叶结点代表一个长度大于1的区间; 线段树的每个非叶结点的左子树代表一个左半区间,右子树代表一个右半区间; 拥有这种性质的搜索树,时间复杂度是O(logn),所以线段树是一种高效的数据结构。 这里,我们用数组来表示线段树,其中数组下标代表结点编号,结点下标为i的结点,其左子结点下标为2i+1,右子结点下标为2i+2。 本文子问题是记录区间最小值,所以线段树结点中存储的是区间最小值。 线段树的构建 线段树的构建过程如下: 确定线段树的深度,即log2(n)向上取整; 创建线段树,每个结点包含一个区间和两个子结点; 代码 12345678910void build(vector<int> &arr, int start, int end, int id) { if(start == end) { ...














