蓝桥杯知识点——day2

1.使用sort进行升序以及降序的排序

cpp 复制代码
//使用sort进行数组的升序以及降序排列 
#include<bits/stdc++.h>
using namespace std;

int main(){
	int n;
	cin>>n;
	vector<int> num(n);
	for(int i = 0; i < n; i++){
		cin>>num[i];
	}
	sort(num.begin(), num.end());
	for(int i = 0; i < n; i++){
		cout<< num[i] <<" "; 
	}
	cout<< endl;
	sort(num.begin(), num.end(), greater<int>());
	for(int i = 0;i < n; i++)
	{
		cout<< num[i] << " "; 
	}
	cout<< endl;
	return 0;	
}

2. 斐波那契数列f[n] % 1e+7的结果

使用循环表示斐波那契数列,不使用递归

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
int f[100005];
int main(){
	int n;
	cin>> n;
	f[1] = 1;
	f[2] = 1;
	for(int i = 3; i <= n; i++){
		f[i] = (f[i-1] + f[i-2]) % mod;
	}
	cout<< f[n];
	return 0;
}

3.输出矩阵的顺时针旋转90度

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

// 定义全局二维数组,大小205x205,满足题目中n/m≤200的常见范围
int num[205][205];

int main(){
    // n:原始数组的行数,m:原始数组的列数
    int n, m;
    cin >> n >> m;

    // 第一步:读取n行m列的原始二维数组
    // 原错误1:for循环条件少写分号 → i = 0; i < n
    // 原错误2:内层循环条件写错 → j < m 而非 i < m
    for(int i = 0; i < n; i++) {          // 遍历每一行(i为行下标)
        for(int j = 0; j < m; j++){       // 遍历每一列(j为列下标)
            cin >> num[i][j];             // 输入第i行第j列的元素
        }
    }

    // 第二步:将数组顺时针旋转90度并输出
    // 旋转逻辑:原始n行m列 → 旋转后m行n列
    // 旋转后第i列(原列)变为第i行,原始行逆序后作为列
    for(int i = 0; i < m ; i++){          // 遍历原始数组的列(旋转后成为行)
        for(int j = 0; j < n; j++){       // 遍历原始数组的行(旋转后成为列)
            // 核心映射关系:num[原始行][原始列] = num[n-1-j][i]
            // n-1-j:将原始行逆序(比如n=3时,j=0→2,j=1→1,j=2→0)
            cout << num[n - 1 - j][i];
            // 控制输出格式:非最后一列加空格,最后一列换行
            if (j != n - 1) {
                cout << " ";
            } else {
                cout << endl;
            }
        }
    }
    return 0;
}

1.枚举(1-3)、2.排序(冒泡、选择、插入、归并、快速、桶、堆、基数)、3.搜索(DFS、BFS、剪枝、双向BFS、记忆化搜索、迭代式加深搜索、启发式搜索)(1-5)、4.贪心(1-5)、5.模拟(1-3)、6.二分(2-5)、7.DP(一维3-5、背包DP、状压DP、数位DP、DP的常见优化)、8.高精度(1-5)、9.数据结构(栈、队列、链表、ST表、堆、树状数组、线段树、Trie树、并查集、平衡树)(2-5)、10.数学(数论3-5、排列组合、二项式定理、容斥定理、矩阵运算、高斯消元)、11. 字符串(哈希、kmp、马拉车)、12.图论(欧拉回路、最小生成树、单元最短路及差分约束系统、拓扑序列、二分图匹配、图的连通性问题【割点、桥、强联通分量】)、13.计算几何(概率论以及博弈论)

一、数组和前缀和

(1)暴力

cpp 复制代码
#include<iostream>
using namespace std;
int main(){
	int n;
	cin>> n;
	int num[n];
	for(int i = 0; i < n; i++){
		cin>>num[i];
	}
	long long sum = 0;
	for(int i = 0; i < n; i++){
		for(int j = i + 1; j < n; j++ ){
			sum += (long long)num[i] * num[j];
		}
	}
	cout<<sum<<endl;
	return 0;
}

(后缀和递推)

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;
int main(){
	int n;
	cin>> n;
	vector<int> num(n);
	for(int i = 0; i < n; i++){
		cin>>num[i];	
	}
	long long sum = 0;
	vector<long long>l_sum (n,0);
	l_sum[n-1] = num[n-1];
	for(int i = n-2; i >= 0; i--){
		l_sum[i] = num[i] + l_sum[i + 1]; 
	}
	for(int i = 0;i < n - 1; i++){
		sum += num[i] * l_sum[i+1];
	}
	cout<<sum<<endl;
	return 0;
} 

前缀和:快速进行计算任意区间[l,r]的和

cpp 复制代码
sum(l,r) = f_sum[r] - f_sum[l - 1]; 

Leecode(303、209、560、304、918)

二、二叉树


1.二叉树的遍历

前序、

cpp 复制代码
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
using namespace std;

struct TreeNode{
		int val;
		TreeNode *left;
		TreeNode *right;
		TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
	};
	
//1.前序
void preOrder(TreeNode *root,vector<int> &res){
	if(root== nullptr) return ;
	res.push_back(root->val);
	preOrder(root->left,res);
	preOrder(root->right,res);
}

后序、

cpp 复制代码
//2.后序
void postOrder(TreeNode *root,vector<int> &res){
	if(root == nullptr ) return ;
	postOrder(root->left,res);
	postOrder(root->right,res);
	res.push_back(root->val);
}

中序、

cpp 复制代码
//3.中序
void inOrder(TreeNode *root,vector<int> &res){
	if(root == nullptr ) return ;
	postOrder(root->left,res);
	res.push_back(root->val);
	postOrder(root->right,res);
	
}

层次

cpp 复制代码
//4.层次(队列实现)
void levelOrder(TreeNode *root ,vector<int> &res){
	if(root == nullptr)  return ;
	queue<TreeNode*> q;//辅助队列 
	q.push(root);//根节点入队 
	while(!q.empty()){
		int n = q.size();//记录当前的层节点数 
		for(int i = 0 ;i < n; i++){
			TreeNode *node = q.front();
			q.pop();
			res.push_back(node->val);
			//左子节点入队 
			if(node->left != nullptr) q.push(node->left);
			//右子节点入队 
			if(node->right != nullptr) q.push(node->right);
		}
	} 
}

利用二叉树的性质求层数解决问题

cpp 复制代码
#include<iostream>
#include<vector>
#include<cmath>

using namespace std;
int main(){
	int n;
	cin>>n;
	vector<int> a(n);
	for(int i = 0; i < n; i++){
		cin>>a[i];
	}
	//计算树的深度 
	int depth = log2(n) + 1;
	//初始化每一层的权值和 
	vector<long long> level_sum(depth + 1,0);
	//计算每一层的权值和 
	for(int i = 0; i< n; i++){
		int level = log2(i + 1) + 1;
		level_sum[level] += a[i]; 
	}
	//找到最大的权值和所在的层 
	long long max_sum = -1;
	int res = 1;
	for(int i = 1; i<=depth;i++){
		if(level_sum[i]>max_sum) {
			max_sum = level_sum[i];
			res = i;
		}
	}
	cout<<res<<endl;
	return 0;
}
 

常用库的概述

iostream:输入输出

vector:动态数组

algorithm:常用算法

string:字符串的相关处理

eg


相关推荐
Wect1 小时前
LeetCode 52. N 皇后 II:回溯算法高效求解
前端·算法·typescript
iFlyCai1 小时前
数据结构与算法之希尔排序
数据结构·算法·排序算法
lcreek2 小时前
LeetCode2208. 将数组和减半的最少操作次数、LeetCode2406.将区间分为最少组数
python·算法
shehuiyuelaiyuehao2 小时前
算法1,移动零
数据结构·算法·排序算法
shehuiyuelaiyuehao2 小时前
算法2,复写零
数据结构·算法
像污秽一样2 小时前
算法设计与分析-算法效率分析基础-习题1.1
c语言·数据结构·c++·算法
abant22 小时前
leetcode 739 单调栈模板题
算法·leetcode·职场和发展
宝贝儿好8 小时前
【强化学习实战】第十一章:Gymnasium库的介绍和使用(1)、出租车游戏代码详解(Sarsa & Q learning)
人工智能·python·深度学习·算法·游戏·机器学习
weixin_4588726111 小时前
东华复试OJ二刷复盘2
算法