C++代码入门02:Vector中的push_back

图源:文心一言

上机题目练习整理,本篇作为线性表的代码补充,提供了两种(差别并不大)算法,供小伙伴们参考~🥝🥝

  • 第1版:在力扣新手村刷题的记录
    • 方法一:自己写的普通答案,借助辅助容器,循环+赋值;
    • 方法二: 文心一言 老师提供的建议,借助辅助容器,循环+Push_back~🧩🧩

编辑:梅头脑🌸

题目:1470. 重新排列数组 - 力扣(LeetCode)


📇目录

📇目录

🧵转换小写字母的题目

🧩题目

🌰方法一:常规赋值解法

🌰方法二:使用push_back

🔚结语


🧵转换小写字母的题目

🧩题目

给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。

请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列,返回重排后的数组。

示例 1:

输入:nums = [2,5,1,3,4,7], n = 3
输出:[2,3,5,4,1,7] 
解释:由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7]

示例 2:

输入:nums = [1,2,3,4,4,3,2,1], n = 4
输出:[1,4,2,3,3,2,4,1]

示例 3:

输入:nums = [1,1,2,2], n = 2
输出:[1,2,1,2]

提示:

  • 1 <= n <= 500
  • nums.length == 2n
  • 1 <= nums[i] <= 10^3

🌰方法一:常规赋值解法

📇算法思路

  • 算法思想:将容器视为数组,使用for循环,分别把 x组的元素nums[i] 与 y组的元素nums[n+i] 给到 新的数组nums1[2*i]与nums1[2*i+1];
  • 时间复杂度:O(n),其中n是数组的长度,代码使用了辅助数组。
  • 空间复杂度:O(n),其中n是数组的长度,代码中每个元素都被遍历了一遍。

 ⌨️算法代码

class Solution {
public:
    vector<int> shuffle(vector<int>& nums, int n) {
        vector<int> nums1(2 * n);   // 初始化nums1的大小为2n
        for (int i = 0; i < n; i++) {
            nums1[2 * i] = nums[i]; // 取x部分的元素
            nums1[2 * i + 1] = nums[n + i]; // 取y部分的元素
        }
        return nums1;
    }
};

 ⌨️温馨提示

可能问题:请注意,以下写法可能会导致上图的编译错误:

  • 第4行直接写为:“vector<int> nums1;”,而非“vector<int> nums1(2 * n);”

问题所在:nums1 被声明了,但没有被初始化。

  • 在 C++ 中,如果你没有初始化一个 std::vector,它的初始大小将是 0。当你试图访问它的元素时(例如 nums1[2 * i]),将会导致未定义行为,因为你正在访问一个不存在的元素。​

🌰方法二:使用push_back

📇算法思路

  • 算法思想:使用push_back方法,依次将分别把 x组的元素nums[i] 与 y组的元素nums[n+i] 添加到 新的数组 result 的末端;
  • 时间复杂度:O(n),其中n是数组的长度。
  • 空间复杂度:O(n),其中n是数组的长度。

 ⌨️算法代码

class Solution {  
public:  
    vector<int> shuffle(vector<int>& nums, int n) {  
        vector<int> result; // 创建一个空的result vector  
        // 遍历数组的前半部分(x部分)和后半部分(y部分)  
        for (int i = 0; i < n; i++) {  
            // 依次将x部分的元素和y部分的元素添加到结果vector中  
            result.push_back(nums[i]);          // 添加x部分的元素  
            result.push_back(nums[n + i]);      // 添加y部分的元素  
        }  
        return result; // 返回重新排列后的数组  
    }  
};

⌨️知识扩展

push_back功能

push_back 是 C++ 标准库容器 vector 中的一个成员函数,用于在向量的末尾添加一个元素。当你调用 push_back 方法时,它会做两件事情:

  • 在 vector 的当前末尾之后分配空间来存储一个新元素。
  • 将新元素复制到分配的空间中,并更新 vector 的大小(size)以反映新添加的元素。

这里有一个简单的例子来展示 push_back 的用法:

  • 我们首先创建了一个空的 vector<int> 名为 numbers
  • 然后,我们使用 push_back 方法三次,每次将一个整数添加到 vector 的末尾。
  • 最后,我们遍历 vector 并输出其内容,结果将是 1 2 3
#include <iostream>  
#include <vector>  
  
int main() {  
    // 创建一个空的 vector<int>  
    std::vector<int> numbers;  
  
    // 使用 push_back 添加元素到 vector 的末尾  
    numbers.push_back(1);  
    numbers.push_back(2);  
    numbers.push_back(3);  
  
    // 输出 vector 的内容  
    for (int num : numbers) {  
        std::cout << num << " ";  
    }  
    std::cout << std::endl;  
  
    return 0;  
}

push_back性能

push_back 的内存分配:

  • ​​​​​​​当使用push_backvector添加元素时,如果当前已分配的内存不足以容纳新元素,vector将重新分配更大的内存块,并将现有元素复制到新位置。这个过程可能会导致性能开销,特别是在大量添加元素时。然而,现代C++标准库的实现通常通过智能内存管理策略来减少这种开销,例如使用指数增长策略来分配内存。

 push_back 的时间复杂度:通常是摊还常数时间。

  • 换句话说,虽然在最坏情况下,单次push_back的时间复杂度是O(n),但是在多次操作的平均情况下,由于内存重新分配和元素复制的分摊效果,每个push_back操作的平均时间复杂度可以降低到O(1)。这就是为什么通常说push_back的摊还时间复杂度是O(1)。

  • 相关参考:🌸https://www.cnblogs.com/limaodeng/p/12651835.html

 方法一与方法二的比较

  • 适用场景:方法一适用于已知最终元素数量的情况,因为它通过提前分配足够的内存来避免多次内存重新分配。方法二则更适用于元素数量不确定或动态变化的情况,因为它提供了更大的灵活性。
  • 性能差异:在已知元素数量的情况下,方法一通常具有更好的性能,因为它避免了多次内存重新分配和数据复制。然而,在元素数量不确定的情况下,方法二的性能也是可以接受的,尤其是当使用现代C++标准库实现时。


🔚结语

博文到此结束,写得模糊或者有误之处,欢迎小伙伴留言讨论与批评,督促博主优化内容{例如有错误、难理解、不简洁、缺功能}等,博主会顶锅前来修改~~😶‍🌫️😶‍🌫️

我是梅头脑,本片博文若有帮助,欢迎小伙伴动动可爱的小手默默给个赞支持一下,感谢点赞小伙伴对于博主的支持~~🌟🌟

同系列的博文:🌸数据结构_梅头脑_的博客-CSDN博客

同博主的博文:🌸随笔03 笔记整理-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Studi安卓读写NDEF智能海报源码

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?id615391857885&spma1z10.5-c.w4002-21818769070.11.1f60789ey1EsPH <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmln…

vscode调试debug,launch.json文件‘args’无法发传递给脚本

问题&#xff1a;调试时&#xff0c;脚本执行&#xff0c;发现在launch.json文件中明明定义了“args”参数&#xff0c;却没有传递给执行命令。 解决&#xff1a; launch.json中的"name"参数不要随便起&#xff0c;要与执行的文件名一致&#xff01; 参考链接&…

品牌全球化:关于跨界合作的探索与解析

在全球化的时代背景下&#xff0c;品牌出海已经成为企业发展的重要战略之一。然而&#xff0c;面对文化差异、市场竞争和消费者需求等多重挑战&#xff0c;品牌如何成功地打入海外市场&#xff0c;是许多企业面临的难题。跨界合作作为一种新兴的商业模式&#xff0c;正逐渐成为…

旅游平台day02

1. 用户注册 概述&#xff1a; 常见的注册方式&#xff1a;邮箱注册、手机号注册、昵称注册、或者以上几种同时支持 本项目仅仅支持手机号注册 需求&#xff1a; 项目启动后&#xff0c;访问regist.html进入注册页面 手机号校验 前后台都需要对手机号进行校验 前端校验&am…

微信小程序+前后端开发学习材料2-(视图+基本内容+表单组件)

学习来源 视图 1.swiper 滑块视图容器。其中只可放置swiper-item组件&#xff0c;否则会导致未定义的行为。 显示面板指示点indicator-dots 基础内容 1.icon 图标组件 实例演示 2.progress 进度条。组件属性的长度单位默认为px&#xff0c;咱用rpx。 实例演示 这…

selenium爬虫爬取当当网书籍信息 | 最新!

如果对selenium不了解的话可以到下面的链接中看基础内容&#xff1a; selenium爬取有道翻译-CSDN博客 废话不多说了下面是代码并且带有详细的注释&#xff1a; 爬取其他类型的书籍和下面基本上是类似的可以自行更改。 # 导入所需的库 from selenium import webdriver from …

node.js(express.js)+mysql实现注册功能

文章目录 实现步骤一、获取客户端提交到服务器的用户信息&#xff0c;对表单中的数据&#xff0c;进行合法性的效验 代码如下:二、检测用户名是否被占用三、对密码进行加密四、插入新用户&#xff08;完整代码&#xff09;总结 实现步骤 一、获取客户端提交到服务器的用户信息…

Vue3中动态组件使用

一&#xff0c;动态组件使用&#xff1a; 应用场景&#xff1a;动态绑定或切换组件 应用Vue3碎片&#xff1a; is 1.使用 a.组件A <div class"layout-base"><Button>红茶</Button> </div>a.组件B <div class"layout-base"&g…

【深度强化学习】目前落地的挑战与前沿对策

到目前为止&#xff0c;深度强化学习最成功、最有名的应用仍然是 Atari 游戏、围棋游戏等。即使深度强化学习有很多现实中的应用&#xff0c;但其中成功的应用并不多。为什么呢&#xff1f;本文总结目前的挑战。 目录 所需的样本数量太大探索阶段代价太大超参数的影响非常大稳定…

【MATLAB源码-第115期】基于matlab的QSM正交空间调制系统仿真,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交空间调制&#xff08;QSM&#xff09;是一种先进的无线通信技术&#xff0c;它通过利用发射端的多天线阵列来传输信息&#xff0c;从而提高了数据传输的效率和速率。这种技术的关键在于它使用天线阵列的空间特性来编码额…

YOLOv8改进 | Conv篇 | 在线重参数化卷积OREPA助力二次创新(提高推理速度 + FPS)

一、本文介绍 本文给大家带来的改进机制是一种重参数化的卷积模块OREPA,这种重参数化模块非常适合用于二次创新,我们可以将其替换网络中的其它卷积模块可以不影响推理速度的同时让模型学习到更多的特征。OREPA是通过在线卷积重参数化(Online Convolutional Re-parameteriza…

uni-app 经验分享,从入门到离职(年度实战总结:经验篇)——上传图片以及小程序隐私保护指引设置

文章目录 &#x1f525;年度征文&#x1f4cb;前言⏬关于专栏 &#x1f3af;关于上传图片需求&#x1f3af;前置知识点和示例代码&#x1f9e9;uni.chooseImage()&#x1f9e9;uni.chooseMedia()&#x1f4cc;uni.chooseImage() 与 uni.chooseMedia() &#x1f9e9;uni.chooseF…

掌握Spring MVC拦截器整合技巧,实现灵活的请求处理与权限控制!

拦截器 1.1 拦截器概念1.2 拦截器入门案例1.2.1 环境准备1.2.2 拦截器开发步骤1:创建拦截器类步骤2:配置拦截器类步骤3:SpringMVC添加SpringMvcSupport包扫描步骤4:运行程序测试步骤5:修改拦截器拦截规则步骤6:简化SpringMvcSupport的编写 1.3 拦截器参数1.3.1 前置处理方法1.3…

【Go学习】macOS+IDEA运行golang项目,报command-line-arguments,undefined

写在前面的话&#xff1a;idea如何配置golang&#xff0c;自行百度 问题1&#xff1a;通过idea的terminal执行go test报错 ✘ xxxxxmacdeMacBook-Pro-3  /Volumes/mac/.../LearnGoWithTests/hello  go test go: go.mod file not found in current directory or any parent …

腾讯云 腾讯云服务器 - 腾讯云 产业智变·云启未来

腾讯云服务器CVM提供安全可靠的弹性计算服务&#xff0c;腾讯云明星级云服务器&#xff0c;弹性计算实时扩展或缩减计算资源&#xff0c;支持包年包月、按量计费和竞价实例计费模式&#xff0c;CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格&#xff0c;提供9个9的数…

jmeter-线程数设置为1,循环10次没问题,循环100次出现异常

一、多次尝试&#xff0c;发现出现异常的接口大致相同。 解决办法&#xff1a;在第一个出现异常的接口下添加超时时间&#xff0c;固定定时器&#xff1a;2000ms&#xff0c;再次运行就没问题了。 二、压力机自身存在的问题 1&#xff09;在网络编程中&#xff0c;特别是在短…

时间序列预测 — BiLSTM-Attention实现单变量负荷预测(Tensorflow)

专栏链接&#xff1a;https://blog.csdn.net/qq_41921826/category_12495091.html 专栏内容 ​ 所有文章提供源代码、数据集、效果可视化 ​ 文章多次上领域内容榜、每日必看榜单、全站综合热榜 ​ ​ ​ ​ ​ ​ ​ 时间序列预测存在的问题 ​ 现有的大量方法没有真正的预测未…

canal server初始化源码分析

CanalLauncher类是canal server端启动的入口类&#xff0c;跟随代码进行深入。 在开始之前&#xff0c;我们可以先了解下&#xff0c; canal 配置方式 ManagerCanalInstanceGenerator&#xff1a; 基于manager管理的配置方式&#xff0c;实时感知配置并进行server重启Spring…

零售EDI:Babylist EDI 项目案例

Babylist 与各种不同的品牌和零售商合作&#xff0c;包括婴儿用品、玩具、衣物和其他相关产品的制造商。用户可以在 Babylist 上浏览各种不同的产品&#xff0c;并根据自己的需求和喜好选择适合的项目。本文将为大家介绍对接Babylist 的EDI项目案例。 Babylist EDI 需求 传输协…