当前位置: 首页 > news >正文

《算法通关指南数据结构和算法篇(1)--- 顺序表相关算法题》

顺序表相关算法题


在这里插入图片描述

🔥小龙报:个人主页
🎬作者简介: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代码
  • 四、颜色分类
    • 4.1题目
    • 4.2算法原理
    • 4.3代码
  • 五、合并两个有序数组
    • 5.1题目
    • 5.2算法原理
    • 5.3代码
  • 总结 --- 每日励志时刻


前言

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


一、询问学号

1.1题目

链接:询问学号
在这里插入图片描述

1.2算法原理

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

1.3代码

1.3.1数组版本

#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

#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代码

#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算法原理

核心思想:数组分两块
在这里插入图片描述

3.3代码

class Solution {
public:void moveZeroes(vector<int>& nums) {int cur = -1;for(int i = 0;i < nums.size();i++){if(nums[i]) //非零{swap(nums[++cur],nums[i]);}}}
};

四、颜色分类

4.1题目

链接:颜色分类
在这里插入图片描述

4.2算法原理

核心思想:数组分三块
在这里插入图片描述

4.3代码

class Solution {
public:void sortColors(vector<int>& nums) {int left = -1;int right = nums.size();int i = 0;while(i < right){if(nums[i] == 0)swap(nums[i++],nums[++left]);else if(nums[i] == 1)i++;else if(nums[i] == 2)swap(nums[i],nums[--right]);}}
};

五、合并两个有序数组

5.1题目

链接:合并两个有序数组
在这里插入图片描述

5.2算法原理

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

5.3代码

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++];elsetemp[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];}
};

总结 — 每日励志时刻

在这里插入图片描述

http://www.dtcms.com/a/548526.html

相关文章:

  • ReentrantLock 加锁与解锁流程详解(源码分析,小白易懂)
  • 鸿蒙Flutter三方库适配指南:06.插件适配原理
  • Linux 防火墙实战:用 firewalld 配置 External/Internal 区域,实现 NAT 内网共享上网
  • Java 学习29:方法
  • Kafka 全方位详细介绍:从架构原理到实践优化
  • Obsidian 入门教程(二)
  • [测试工具] 如何把离线的项目加入成为git项目的新分支
  • 让数据导入导出更智能:通用框架+验证+翻译的一站式解决方案
  • 今天我们学习Linux架构keepalived实现LVS代理双击热备
  • [Linux]内核队列实现详解
  • 【Spring Cloud】Spring Cloud Config
  • MySQL | 数据查询DQL语言:分组统计
  • 阿里云灵码IDE技术测评:从v0.1.0到v0.1.5的进化之路
  • 江门网站推广技巧asp网站服务建设
  • C++: inline 与 ODR,冲突的诞生
  • 营销型 展示类网站企业网站建设空间
  • 从单体到微服务:Java的分布式演进与工程实战
  • 【论文笔记】扩散模型——如何通俗理解传统概率模型的核心矛盾
  • android15 实现截屏功能
  • 工业4.0数据中枢:重构产品全生命周期的智能设计范式
  • 深度解析《AI+Java编程入门》:一本为零基础重构的Java学习路径
  • 架构论文《论数字孪生系统架构设计与应用》
  • 郑州网站建设汉狮如何让百度收录自己的网站信息
  • 英一2017年真题学习笔记
  • PaddleOCR-VL对标DeepSeek-OCR?
  • DeepSeek-OCR 论文精读与实践:用“光学上下文压缩”把长文本变成图片,再由 VLM 高效还原
  • 创新网站内容建设企业建网站的案例
  • 沈阳建站模板系统包括如何自己创建一个网页
  • NLP模型优化
  • 运行当前位置,显示文件全名,检查是否扩展名多次重叠