算法竞赛小白晋级之路---动态顺序表vector的介绍+几道基础题目

1.静态顺序表的封装

这个部分的内容主要就是想要表达下面的这个意思:

在我们的没有引入这个顺序表之前,我们使用的就是数组和一个n控制这个里面的元素的个数即可,但是如果在这个方式下面,我们想要定义多个顺序表,这个时候需要很多的N常量的定义和很多个这个数组的定义,这个显然是非常的臃肿的,因此我们提出了这个封装的思路;

2.动态顺序表--vector

  • size()可以用来对于这个容器里面的元素进行遍历的时候使用,比如这个for循环里面;
  • empty就是判断我们的这个容器里面是不是存在着元素,返回的是bool类型的数据;
  • begin()返回的就是我们的这个容器里面的开始位置的这个迭代器,end()函数返回的就是我们的这个容器里面的结束位置的迭代器;
cpp 复制代码
void print(vector<int>& a)
{
    for(vector<int>::iterator it=a.begin();it!=a.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
    
    for(auto it=a.begin();it!=a.end();it++)
    {
        cout<<*it<<" ";
    }
    cout<<endl;
    
    for(auto x:a)
    {
        cout<<x<<" ";
        cout<<endl;
    }
}
  • front和back函数返回的就是我们的容器里面的开头元素和结尾元素;
  • push_back和pop_back就是进行尾插和尾删的操作;
  • resize函数是修改我们的合格容器的容量的大小;
  • resize进行扩大这个容量的大小的时候,就直接添加0即可,变小的话就是删除原来的元素;

3.简单题目运用

3.1查询学号

下面的这个就是我们的题目,来自于洛谷平台:

下面的这个就是我们的代码:

1)其实这个题目针对于下标的处理,我们可以使用两种方法,一个就是我下面的这个方法,输出的时候使用的是temp下标-1的方法;

2)还有一个方法就是直接在读入数据的时候下标从1开始,这个时候我们输出的时候就可以直接按照读入的这个数据temp下标进行输出即可;

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

const int N = 2e6 + 10;
int main()
{
	int n, m;
	cin >> n >> m;
	vector<int> a(N);
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	while (m--)
	{
		int temp;
		cin >> temp;
		cout << a[temp-1] << endl;
	}
	return 0;
}

3.2寄包柜问题

下面的这个就是我们的求解代码

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

const int N = 1e5 + 10;
int n, q;
vector<int> a[N];

int main()
{
	cin >> n >> q;
	while (q--)
	{
		int op, i, j, k;
		cin >> op >> i >> j >> k;
		if (op == 1)
		{
			cin >> k;
			if (a[i].size() <= j)
			{
				a[i].resize(j + 1);
			}
			a[i][j] = k;
		}
		else
		{
			cout << a[i][j] << endl;
		}
	}
	return 0;
}

3.3移动零问题

下面的这个就是我们的思路,其实这个题目是非常的经典的,即使是我这样的小白,也已经写这样的这个题目很多次了,主要就是双指针的方式,分别对于我们的这个非零元素,0元素和这个没有扫描的内容进行遍历的操作;

双指针的这个文章我之前应该就写过,也是我们参加各大竞赛必须要学习的算法,也是非常经典的算法,也就是对于我们的这个数据进行分快的操作,针对于这个题目就是三块:

0-cur:全部都是非零元素;

cur+1~i-1:都是我们的0元素;

i~最后:都是我们的没有扫描的元素;

当我们遇到0元素的时候,直接让这个i++即可,这个时候我们的这个0元素就进入到了这个中间块里面去了;

遇到非零元素的时候,cur+1位置的这个0和我们的这个i位置的元素进行交换,然后cur++,i++

相关推荐
小苏兮2 小时前
【C语言】字符串与字符函数详解(上)
c语言·开发语言·算法
一只小蒟蒻3 小时前
DFS 迷宫问题 难度:★★★★☆
算法·深度优先·dfs·最短路·迷宫问题·找过程
martian6653 小时前
深入详解随机森林在眼科影像分析中的应用及实现细节
人工智能·算法·随机森林·机器学习·医学影像
apocelipes3 小时前
使用uint64_t批量比较短字符串
c语言·数据结构·c++·算法·性能优化·golang
一只IT攻城狮3 小时前
构建一个简单的Java框架来测量并发执行任务的时间
java·算法·多线程·并发编程
WanderInk3 小时前
在递归中为什么用 `int[]` 而不是 `int`?——揭秘 Java 参数传递的秘密
java·后端·算法
ai小鬼头4 小时前
创业心态崩了?熊哥教你用缺德哲学活得更爽
前端·后端·算法
拾光拾趣录5 小时前
算法 | 下一个更大的排列
前端·算法
熬了夜的程序员5 小时前
【华为机试】122. 买卖股票的最佳时机 II
开发语言·算法·华为·面试·golang
qqxhb5 小时前
零基础数据结构与算法——第五章:高级算法-动态规划经典-背包问题
算法·动态规划·完全背包·编辑距离·0-1背包