vector的OJ题

1、只出现一次的数字(异或)

//1、只出现一次的数字(异或)
// 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现一次的元素。

class Solution
{
public:
	int singleNumber(vector<int>& nums)
	{
		int val = 0;
		for (auto e : nums)
		{
			val ^= e; //按位异或:相同为0,相异为1
			return val;
		}
	}
};

2、杨辉三角形

//2、杨辉三角形
// 给定一个非负整数 numRows, 生成杨辉三角形的前 numRows行。在杨辉三角形中,每个数是它左上方和右上方的数之和。

#include <iostream>
#include <vector>
using namespace std;

class Solution
{
public:
	static vector<vector<int>> generate(int numRows)
	{
		vector<vector<int>> vv;
		vv.resize(numRows);
		for (size_t i = 0; i < vv.size(); ++i)
		{
			vv[i].resize(i + 1, 0);
			vv[i].front() = vv[i].back() = 1; //先将 vv[i]数组中的第一个和最后一个元素置为1
		}
		//计算出剩余位置的数值
		for (size_t i = 0; i < vv.size(); ++i)
		{
			for (size_t j = 0; j < vv[i].size(); ++j)
			{
				if (vv[i][j] == 0)
				{
					vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];
				}
			}
		}

		return vv;
	}
};

int main()
{
	Solution::generate(5);
	return 0;
}

### HDU OJ 经典必刷列表 以下是针对初学者到中级水平学习者的经典目推荐,涵盖了算法设计中的基本概念和技巧: #### 基础入门篇 这些目适合刚开始接触编程竞赛的学生,主要涉及简单的逻辑判断、循环结构以及数组操作。 1. **P2010 水仙花数** - 描述:找出所有的三位数中满足其各位数字立方之和等于该数本身的数。 - 难度:简单 - 提示:可以通过三重嵌套循环枚举每一位数字来实现[^2]。 2. **P2000 古代密码** - 描述:给定一组字符串,统计其中特定字符的数量并输出结果。 - 难度:简单 3. **P2001 计算两点间的距离** - 描述:输入两个二维平面上的坐标点,计算它们之间的欧几里得距离。 - 难度:简单 --- #### 数据结构初步篇 此部分目旨在帮助学生熟悉一些常见的数据结构应用,比如栈、队列等。 4. **P1003 我是大富翁** - 描述:模拟银行账户存取款过程,处理一系列交易指令后返回最终余额。 - 难度:中等 5. **P1004 打印最大值序列** - 描述:维护一个滑动窗口的最大值记录表,在线查询任意时刻的最大值。 - 难度:中等 - 提示:可以利用双端队列优化时间复杂度至 \(O(n)\)[^3]。 6. **P1007 矩阵路径求和** - 描述:在一个矩阵上找到一条从左上角走到右下角的最短路径,使得经过的所有格子数值总和最小。 - 难度:中等 --- #### 动态规划与递归篇 动态规划是一种重要的解方法,适用于许多具有最优子结构性质的问;而递归则常用于解决分治类问。 7. **P1089 不容易系列之一** - 描述:定义一种特殊的排列方式,求数组按照这种规则重新排序后的形式。 - 难度:较难 8. **P1024 Max Sum Plus Plus** - 描述:扩展经典的连续子数组最大和问,允许划分成多个不相交区间分别求和再累加得到全局最大值。 - 难度:困难 9. **P1018 Big Number** - 描述:高精度整数乘法运算,支持超大数据范围内的精确计算。 - 难度:困难 --- #### 图论基础篇 图论作为离散数学的重要分支,在计算机科学领域有着广泛的应用场景。 10. **P1232 完全二叉树的高度** - 描述:已知一棵完全二叉树节点总数n,请求出它的高度h。 - 难度:中等 11. **P1233 最小生成树** - 描述:采用Kruskal或者Prim算法构建连通无向带权图的一棵代价最低的生成树。 - 难度:中等 12. **P1234 单源最短路** - 描述:Dijkstra或Bellman-Ford算法求指定起点到达其他各顶点间最短距离。 - 难度:中等 ```cpp #include <iostream> #include <vector> #include <queue> using namespace std; // Dijkstra's algorithm example implementation const int INF = 1e9; void dijkstra(vector<vector<pair<int, int>>> &graph, vector<int> &dist, int start){ priority_queue<pair<int,int>, vector<pair<int,int>>, greater<>> pq; dist[start]=0; pq.push({0,start}); while(!pq.empty()){ auto [d,u]=pq.top(); pq.pop(); if(d!=dist[u]) continue; for(auto &[v,w]: graph[u]){ if(dist[v]>d+w){ dist[v]=d+w; pq.push({dist[v], v}); } } } } ``` --- #### 数学思维训练篇 某些看似复杂的难往往通过巧妙运用数学原理能够迎刃而解。 13. **P1235 费马小定理验证** - 描述:快速检验某个正整数p是否可能是素数的一种概率型测试手段。 - 难度:较高 14. **P1236 大组合数模意义下的高效计算** - 描述:基于Lucas定理预处理阶乘逆元从而加速大规模组合计数任务。 - 难度:很高 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值