基础算法——顺序表

一、询问学号

题⽬来源:洛⾕

题⽬链接:P3156 【深基15.例1】询问学号 - 洛谷

难度系数:★

1. 题目描述

2. 算法原理

直接⽤ vector 或者数组模拟即可。

3. 参考代码

#include <iostream>
#include <vector>using namespace std;const int N = 2e6 + 10;int n, m;
vector<int> a(N);int main()
{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;
}

二、寄包柜

题⽬来源:洛⾕

题⽬链接:P3613 【深基15.例2】寄包柜 - 洛谷

难度系数:★

1. 题目描述

2. 算法原理

解法1:创建二维数组(空间复杂度过高)

解法2:使用vector——vector<int> a[N]

注意

  • vector<int> a[N] 定义了一个包含 N 个 vector<int> 对象的数组。(类似二维数组)
  • vector<int> a(N) 定义了一个 vector<int> 对象 a,并将其初始化为包含 N 个元素,这些元素的初始值默认为 0(对于 int 类型)。

3. 参考代码

#include <iostream>
#include <vector>using namespace std;const int N = 1e5 + 10;int n, q;
vector<int> a[N]; // 创建 N 个柜子int main()
{cin >> n >> q;while(q--){int op, i, j, k;cin >> op >> i >> j;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;
}

三、移动零

题⽬来源:⼒扣

题⽬链接:283. 移动零 - 力扣(LeetCode)

难度系数:★

1. 题目描述 

2. 算法原理

利用双指针

类⽐数组分两块的算法思想,这⾥是将数组分成三块,那么我们可以再添加⼀个指针,实现数组分三 块。

设数组⼤⼩为 n ,定义三个指针 left, cur,right :

  • left :⽤来标记 0 序列的末尾,因此初始化为 -1 ;
  • cur⽤来扫描数组,初始化为 0 ; 
  • right :⽤来标记 2 序列的起始位置,因此初始化为 n  。

在往后扫描的过程中,保证:

  • [0, left] 内的元素都是 0 ;
  • [left + 1,cur − 1]内的元素都是 1 ; 
  • [cur, right − 1] 内的元素是待定元素;
  • [right, n] 内的元素都是 2 。

3. 参考代码

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

四、颜⾊分类

题⽬来源:⼒扣 

题⽬链接:75. 颜色分类 - 力扣(LeetCode)

难度系数:★

1. 题目描述

2. 算法原理

类⽐数组分两块的算法思想,这⾥是将数组分成三块,那么我们可以再添加⼀个指针,实现数组分三 块。

设数组⼤⼩为 ,定义三个指针left, cur,right :

  • left:⽤来标记 序列的末尾,因此初始化为 ;
  • cur:⽤来扫描数组,初始化为 ;
  • right:⽤来标记 序列的起始位置,因此初始化为 。

在 往后扫描的过程中,保证:

  • [0, left] 内的元素都是 ;
  • [left + 1,cur − 1] 内的元素都是 ;
  • [cur, right − 1] 内的元素是待定元素;
  • [right, n] 内的元素都是 。

  

 

3. 参考代码

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

五、合并两个有序数组

题⽬来源:⼒扣

题⽬链接:88. 合并两个有序数组 - 力扣(LeetCode)

难度系数:★

1. 题目描述

2. 算法原理

解法⼀:利⽤辅助数组(需要学会,归并排序的核⼼步骤)

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

解法⼆:原地修改(本题的最优解)

与解法⼀的核⼼思想是⼀样的。

由于第⼀个数组的空间本来就是 n+m 个,所以我们可以直接把最终结果放在 nums1 中。 nums1 中。为了不 覆盖未遍历到的元素,定义两个指针指向两个数组的末尾,从后往前扫描。每次拿出较⼤的元素也是 从后往前放在 nums1 的后⾯,直到把所有元素全部放在 nums1 中。

注意:从前往后遍历会出现覆盖的情况

3. 参考代码

//解法一
class Solution 
{
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {// 解法一:利用辅助数组vector<int> tmp(m + n);int cur = 0, cur1 = 0, cur2 = 0;while(cur1 < m && cur2 < n){if(nums1[cur1] <= nums2[cur2]) tmp[cur++] = nums1[cur1++];else tmp[cur++] = nums2[cur2++];}while(cur1 < m) tmp[cur++] = nums1[cur1++];while(cur2 < n) tmp[cur++] = nums2[cur2++];for(int i = 0; i < n + m; i++) nums1[i] = tmp[i];}
};//解法二
class Solution 
{
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {// 解法二:原地合并int cur1 = m - 1, cur2 = n - 1, cur = m + n - 1;while(cur1 >= 0 && cur2 >= 0){if(nums1[cur1] >= nums2[cur2]) nums1[cur--] = nums1[cur1--];else nums1[cur--] = nums2[cur2--];}while(cur2 >= 0) nums1[cur--] = nums2[cur2--];}
};

六、The Blocks Problem

题⽬来源:洛⾕

题⽬链接:UVA101 The Blocks Problem - 洛谷

难度系数:★★

2. 算法原理

本质是⼀个模拟题,可以⽤ vector 来模拟,注意细节问题。

3. 参考代码

#include <iostream>
#include <vector>using namespace std;const int N = 30;
typedef pair<int, int> PII;int n;
vector<int> p[N]; // 创建 n 个放木块的槽PII find(int x)
{for(int i = 0; i < n; i++){for(int j = 0; j < p[i].size(); j++){if(p[i][j] == x){return {i, j};}}}
}void clean(int x, int y)
{// 把 [x, y] 以上的木块归位for(int j = y + 1; j < p[x].size(); j++){int t = p[x][j];p[t].push_back(t);}p[x].resize(y + 1);
}void move(int x1, int y1, int x2)
{// 把 [x1, y1] 及其以上的木块放在 x2 上面for(int j = y1; j < p[x1].size(); j++){p[x2].push_back(p[x1][j]);}p[x1].resize(y1);
}int main()
{cin >> n;// 初始化for(int i = 0; i < n; i++){p[i].push_back(i);}string op1, op2;int a, b;while(cin >> op1 >> a >> op2 >> b){// 查找 a 和 b 的位置PII pa = find(a);int x1 = pa.first, y1 = pa.second;PII pb = find(b);int x2 = pb.first, y2 = pb.second;if(x1 == x2) continue; // 处理不合法的操作if(op1 == "move") // 把 a 上方归位{clean(x1, y1);}if(op2 == "onto") // 把 b 上方归位{clean(x2, y2);}move(x1, y1, x2);}// 打印for(int i = 0; i < n; i++){cout << i << ":";for(int j = 0; j < p[i].size(); j++){cout << " " << p[i][j];}cout << endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu用户安装cpolar内网穿透

前言 Cpolar作为一款体积小巧却功能强大的内网穿透软件&#xff0c;不仅能够在多种环境和应用场景中发挥巨大作用&#xff0c;还能适应多种操作系统&#xff0c;应用最为广泛的Windows、Mac OS系统自不必多说&#xff0c;稍显小众的Linux、树莓派、群辉等也在起支持之列&#…

C#实现高性能异步文件下载器(支持进度显示/断点续传)

一、应用场景分析 异步文件下载器用处很大&#xff0c;当我们需要实现以下功能时可以用的上&#xff1a; 大文件下载&#xff08;如4K视频/安装包&#xff09; 避免UI线程阻塞&#xff0c;保证界面流畅响应多任务并行下载 支持同时下载多个文件&#xff0c;提升带宽利用率后台…

Oracle比较好的几本书籍

1.《Oracle专家高级编程》 2.《Oracle高效设计》 3.《Oracle9i&10g&11g编程艺术深入数据库体系结构》 4.《让Oracle跑的更快》(1/2) ....... n.《Oracle官方文档的阅读》下面包括这几个部分&#xff0c;可以跟进研读一下&#xff1a; &#xff08;1&#xff09;《…

js和java中方法重载(js本身是不支持方法重载,方便对比学习)

js如果需要实现方法重载 示例 1&#xff1a;根据参数数量实现重载 function overloadExample() {if (arguments.length 1) {console.log(一个参数:, arguments[0]);} else if (arguments.length 2) {console.log(两个参数:, arguments[0], arguments[1]);} else {console.l…

Android : Camera之CHI API

来自&#xff1a; https://www.cnblogs.com/szsky/articles/10861918.html 一、CAM CHI API功能介绍&#xff1a; CHI API建立在Google HAL3的灵活性基础之上&#xff0c;目的是将Camera2/HAL3接口分离出来用于使用相机功能&#xff0c;它是一个灵活的图像处理驱动程序&#…

Netty基础—2.网络编程基础四

大纲 1.网络编程简介 2.BIO网络编程 3.AIO网络编程 4.NIO网络编程之Buffer 5.NIO网络编程之实战 6.NIO网络编程之Reactor模式 5.NIO网络编程之Buffer (1)Buffer的作用 Buffer的作用是方便读写通道(Channel)中的数据。首先数据是从通道(Channel)读入缓冲区&#xff0c;从…

Git前言(版本控制)

1.Git 目前世界上最先进的分布式版本控制系统。 git官网&#xff1a;https://git-scm.com/ 2.版本控制 2.1什么是版本控制 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容修改历史&#xff0c;方便查看更改历史记录备份以便恢复以前…

调试正常 ≠ 运行正常:Keil5中MicroLIB的“量子态BUG”破解实录

调试正常 ≠ 运行正常&#xff1a;Keil5中MicroLIB的“量子态BUG”破解实录——从勾选一个选项到理解半主机模式&#xff0c;嵌入式开发的认知升级 &#x1f4cc; 现象描述&#xff1a;调试与烧录的诡异差异 在线调试时 程序正常运行 - 独立运行时 设备无响应 ! 编译过程 0 Err…

算法每日一练 (9)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 算法每日一练 (9)最小路径和题目描述解题思路解题代码…

【高项】信息系统项目管理师(四)项目整合管理【4分】

一、管理基础 项目整合管理的责任不能被授权或转移&#xff0c;项目经理必须对整个项目承担最终责任。 执行项目整合时项目经理承担双重角色&#xff1a; 1、组织层面上&#xff0c;项目经理扮演重要角色&#xff0c;与项目发起人携手合作&#xff0c;了解战略目标并确保项目目…

ECEF与ENU坐标系定义及C语言实现

一、ECEF与ENU坐标系定义 ECEF坐标系&#xff08;地心地固坐标系&#xff09; 原点&#xff1a;地球质心X轴&#xff1a;指向本初子午线与赤道交点Y轴&#xff1a;在赤道平面内与X轴垂直Z轴&#xff1a;指向北极数学表示&#xff1a; P e c e f ( x , y , z ) P_{ecef} (x,…

sql语句分页的关键字是?

在 SQL 中&#xff0c;分页通常是通过限制查询结果的数量并指定从哪一行开始获取数据来实现的。不同的数据库系统使用不同的分页关键字。 以下是常见数据库系统的分页关键字&#xff1a; MySQL / PostgreSQL / SQLite 使用 LIMIT 和 OFFSET 来进行分页&#xff1a; LIMIT 限…

大模型中的剪枝、蒸馏是什么意思?

环境&#xff1a; 剪枝 蒸馏 问题描述&#xff1a; 大模型中的剪枝、蒸馏是什么意思&#xff1f; 解决方案&#xff1a; 大模型的剪枝&#xff08;Pruning&#xff09;和蒸馏&#xff08;Distillation&#xff09;是两种常见的模型优化技术&#xff0c;用于减少模型的大小…

初次体验Tauri和Sycamore(3)通道实现

​ 原创作者&#xff1a;庄晓立&#xff08;LIIGO&#xff09; 原创时间&#xff1a;2025年03月10日&#xff08;发布时间&#xff09; 原创链接&#xff1a;https://blog.csdn.net/liigo/article/details/146159327 版权所有&#xff0c;转载请注明出处。 20250310 LIIGO备注&…

代码随想录|二叉树|07二叉树周末总结

对前面01~06二叉树内容进行小结&#xff0c;直接看下面的总结文档&#xff1a; 本周小结&#xff01;&#xff08;二叉树&#xff09; | 代码随想录

蓝耘赋能通义万相 2.1:用 C++ 构建高效 AI 视频生成生态

目录 开篇&#xff1a;AI 视频生成新时代的号角 通义万相 2.1&#xff1a;AI 视频生成的领军者 核心技术揭秘 功能特点展示 与其他模型的全面对比 C&#xff1a;高效编程的基石 C 的发展历程与特性 C 在 AI 领域的广泛应用 通义万相 2.1 与 C 的完美融合 融合的意义与…

【一句话经验】ubuntu vi/vim 模式自动设置为paste

从centos过来&#xff0c;发现ubutun有些地方不习惯&#xff0c;尤其是vi的粘贴&#xff0c;默认自动进去了代码模式&#xff0c;导致每次粘贴必须得set paste&#xff0c;否则会出现问题。 解决办法非常简单&#xff0c;按照下面命令执行即可&#xff1a; cd ~ echo "…

自然语言处理文本分析:从词袋模型到认知智能的进化之旅

清晨&#xff0c;当智能音箱准确识别出"播放周杰伦最新专辑"的模糊语音指令时&#xff1b;午间&#xff0c;企业舆情系统自动标记出十万条评论中的负面情绪&#xff1b;深夜&#xff0c;科研人员用GPT-4解析百万篇论文发现新材料线索——这些场景背后&#xff0c;是自…

《Python基础教程》附录B笔记:Python参考手册

《Python基础教程》第1章笔记&#x1f449;https://blog.csdn.net/holeer/article/details/143052930 附录B Python参考手册 Python标准文档是完整的参考手册。本附录只是一个便利的速查表&#xff0c;当你开始使用Python进行编程后&#xff0c;它可帮助你唤醒记忆。 B.1 表…

uniapp+Vue3 组件之间的传值方法

一、父子传值&#xff08;props / $emit 、ref / $refs&#xff09; 1、props / $emit 父组件通过 props 向子组件传递数据&#xff0c;子组件通过 $emit 触发事件向父组件传递数据。 父组件&#xff1a; // 父组件中<template><view class"container">…