《算法通关指南:数据结构和算法篇 --- 顺序表相关算法题》--- 询问学号,寄包柜,合并两个有序数组

《算法通关指南:数据结构和算法篇 --- 顺序表相关算法题》--- 询问学号,寄包柜,合并两个有序数组


🔥小龙报:个人主页

🎬作者简介:C++研发,嵌入式,机器人方向学习者

❄️个人专栏:《C语言》《算法》KelpBar海带Linux智慧屏项目

✨***永远相信美好的事情即将发生***

文章目录

  • 《算法通关指南:数据结构和算法篇 --- 顺序表相关算法题》--- 询问学号,寄包柜,合并两个有序数组
  • 前言
  • 一、询问学号
    • 1.1题目
    • 1.2算法原理
    • 1.3代码
      • 1.3.1数组版本
      • 1.3.2vector
  • 二、寄包柜
    • 2.1题目
    • 2.1算法原理
    • 2.3代码
  • 三、合并两个有序数组
    • 3.1题目
    • 3.2算法原理
    • 3.3代码
  • 总结 --- 每日励志时刻

前言

本系列讲解算法竞赛的数据结构在算法竞赛中,我们主要关心的其实是时间开销,空间上是基本够用的,因此我们是使用庞大的数组实现的话不多说冲!


一、询问学号

1.1题目

链接:询问学号

1.2算法原理

这道题就是用数组存储每一个进来的学生,数组的下标表示同学是第 i 个进入教室的

1.3代码

1.3.1数组版本

c 复制代码
#include <iostream>
using namespace std;
const int N = 2e6 + 10;
int a[N];
int main()
{
	int n, m;
	cin >> n >> m;

	for (int i = 1; i <= n; i++)
		cin >> a[i];

	while (m--)
	{
		int x;
		cin >> x;

		cout << a[x] << endl;
	}
	return 0;
}

1.3.2vector

c 复制代码
#include <iostream>
#include <vector>
using namespace std;
const int N = 2e6 + 10;
vector<int> a(N);
int main()
{
	int n, m;
	cin >> n >> m;

	for (int i = 1; i <= n; i++)
		cin >> a[i];

	while (m--)
	{
		int x;
		cin >> x;

		cout << a[x] << endl;
	}
	return 0;
}

二、寄包柜

2.1题目

链接:寄包柜

2.1算法原理

解法就是如果是一就把k放到第i个柜子的第j个格子如果是2输出即可

注意:这道题ai是未知的使用二维数组会报错(数组开辟空间过大),故使用vector,因为vector数组在开辟空间下标从0开始,故当a[i].size() <= j时便要扩容到j+1即可

2.3代码

c 复制代码
#include <iostream>
#include <vector>
using namespace std;
const int N = 1e5 + 10;
vector<int> a[N];   //创建n个柜子
int main()
{
	int n, q;
	cin >> n >> q;

	while (q--)
	{
		int i, j, k, op;
		cin >> op >> i >> j;

		if (op == 1)
		{
			cin >> k;
			if (a[i].size() <= j) //vector创建从下标0开始
				a[i].resize(j + 1);
			a[i][j] = k;

		}
		else if (op == 2)
			cout << a[i][j] << endl;
	}
	return 0;
}

三、合并两个有序数组

3.1题目

链接:合并两个有序数组

3.2算法原理

可以创建⼀个辅助数组temp,然后用两个指针分别指向两个数组。每次拿出⼀个较小的元素放在辅助数组中,直到把所有元素全部放在辅助数组中。最后把辅助数组的结果覆盖到nums1中

3.3代码

c 复制代码
class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
       vector<int> temp(m + n);
       int cur1 = 0,cur2 = 0,i = 0;
       while(cur1 < m && cur2 < n)
       {
        if(nums1[cur1] <= nums2[cur2])
            temp[i++] = nums1[cur1++];
        else
            temp[i++] = nums2[cur2++];
       } 
       while(cur1 < m)
       {
           temp[i++] = nums1[cur1++];
       }
       while(cur2 < n)
        temp[i++] = nums2[cur2++];
       for(int i = 0;i < m + n;i++)
        nums1[i] = temp[i];
    }
};

总结 --- 每日励志时刻

相关推荐
曹牧1 分钟前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言
浅念-4 分钟前
C++入门(2)
开发语言·c++·经验分享·笔记·学习
WeiXiao_Hyy5 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
User_芊芊君子11 分钟前
CANN010:PyASC Python编程接口—简化AI算子开发的Python框架
开发语言·人工智能·python
苏渡苇11 分钟前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
小羊不会打字12 分钟前
CANN 生态中的跨框架兼容桥梁:`onnx-adapter` 项目实现无缝模型迁移
c++·深度学习
JQLvopkk18 分钟前
C# 实践AI :Visual Studio + VSCode 组合方案
人工智能·c#·visual studio
团子的二进制世界18 分钟前
G1垃圾收集器是如何工作的?
java·jvm·算法
Max_uuc21 分钟前
【C++ 硬核】打破嵌入式 STL 禁忌:利用 std::pmr 在“栈”上运行 std::vector
开发语言·jvm·c++
吃杠碰小鸡21 分钟前
高中数学-数列-导数证明
前端·数学·算法