【C++】vector系列力扣刷题日志(136.只出现一次的数字,118.杨辉三角,26.删除有序数组中的重复项,260.只出现一次的数字 |||)

目录

136.只出现一次的数字

118.杨辉三角

26.删除有序数组中的重复项

260.只出现一次的数字 |||


vector的详细介绍及用法这里就不过多赘述了,可以参考上一篇博客:vector的介绍及使用说明

136.只出现一次的数字

题目:

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1 :

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

示例 2 :

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

示例 3 :

输入:nums = [1]
输出:1

题目要求我们找到只出现了一次的元素,我们最先想到的思路是,遍历一遍数组,记录当前的元素并再进行一次遍历,判断该元素的出现次数,如果只出现了一次,就输出结果。定义一个常量来标记当前出现次数:

class Solution {
public:int singleNumber(vector<int>& nums) {for (auto value = nums.begin(); value != nums.end(); value++){int flag = 2;for (auto it = nums.begin(); it != nums.end(); it++){if (*it == *value) {flag--;}}if (flag)return *value;}return 0;}
};

思路没有问题,但是这种解法的性能消耗显然过高,因为使用的是嵌套循环,时间复杂度来到了O(n^2),那么还有没有别的解法呢?来看下面这个思路:

这道题目也可以通过异或运算来解决,异或运算有一个性质:任何数和0做异或运算,结果仍然是原来的数,即a^0=a。任何数和自身做异或运算,结果是0,即a^a=0。

我们只需要让数组内元素两两做异或,再将结果与后一个元素异或,最终的到的结果就是只出现了一次的那个数。

 如此一来,只需遍历一次数组就得到了结果:

class Solution {
public:int singleNumber(vector<int>& nums) {int result = 0;for (int num : nums) {result ^= num;}return result;}
};

 可以看到,性能提高了不止一点

118.杨辉三角

题目

给定一个非负整数 numRows生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。

示例 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1
输出: [[1]]

题目要求我们创建一个包含杨辉三角的vector容器,存储在一个二维数组当中,我们可以使用vector的push_back方法插入元素,vector会自动扩容,不需要我们管理内存,由于返回的是一个二维数组,我们先创建一个一维数组,再将其插入到二位数组当中即可:

class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> vv;for (int i = 0; i < numRows; i++) {vector<int> row;for (int j = 0; j <= i; j++) {if (j == 0 || j == i) {row.push_back(1);} else {row.push_back(vv[i - 1][j - 1] + vv[i - 1][j]);}}vv.push_back(row);}return vv;}};

26.删除有序数组中的重复项

题目:

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。

示例 1:

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

示例 2:

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

这道题目和前面的第一题相似,不过这道题找的是重复项并需要进行删除操作,同样的,我们可以使用vector的erase方法,其实质是将指定的元素进行删除并且将后序的元素向前移动填补空缺,显然符合题目要求:

class Solution {
public:int removeDuplicates(vector<int>& nums) {for (auto value = nums.begin(); value != nums.end(); value++){int flag = 2;for (auto it = nums.begin(); it != nums.end();){if (*it == *value) {flag--;if (flag < 1) {it = nums.erase(it);}else {++it;}}else {++it;}}}return nums.size();
}
};

要注意的是,使用erase删除元素后,原来指向被删除元素的迭代器就不再指向一个有效的元素了,因为被删除元素之后的所有元素都向前移动了一个位置,迭代器指向的位置已经被其他元素占据。如果继续使用这个迭代器进行操作,比如解引用或者递增,就会导致未定义行为

为了避免这种情况,通常建议在调用‘erase’删除元素后,使用‘erase’返回的新的迭代器,以确保迭代器指向的位置是有效的。

260.只出现一次的数字 |||

题目:

给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。

示例 1:

输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。

示例 2:

输入:nums = [-1,0]
输出:[-1,0]

示例 3:

输入:nums = [0,1]
输出:[1,0]

此题和第一题更为相像了,这里要找的是两个只出现了一次的元素,所以我们只需要在第一题的基础上,改动以下返回值就可以了,返回一个vector容器,里面存放两个元素:

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {vector<int> ret;for (auto value = nums.begin(); value != nums.end(); value++){int flag = 2;for (auto it = nums.begin(); it != nums.end(); it++){if (*it == *value) {flag--;}}if (flag)ret.push_back(*value);}return ret;
}};

在实际运用中我们要熟悉vector的常见接口,在合适的场景中使用出来

以上就是vector的一些实际运用场景,欢迎在评论区留言,觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~😉

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

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

相关文章

开源代码分享(17)—基于yalmip+cplex的微电网优化调度(附matlab代码)

1基本概念 微网&#xff08;Micro-Grid&#xff0c;MG&#xff09;是进行电能调度时常见的概念&#xff0c;作为组织各分布式单元的结构。微网概念的提出旨在实现分布式电源的灵活、高效应用&#xff0c;解决数量庞大、形式多样的分布式电源并网问题[8]。微网中集成了电源、储能…

ZooKeeper 的持久化机制

持久化的定义&#xff1a; 数据&#xff0c;存到磁盘或者文件当中。机器重启后&#xff0c;数据不会丢失。内存 -> 磁盘的映射&#xff0c;和序列化有些像。 ZooKeeper 的持久化&#xff1a; SnapShot 快照&#xff0c;记录内存中的全量数据TxnLog 增量事务日志&#xff…

11.牛客---链表分割(Java版)

又没找到题目链接 题解: 错误之系列之一 错误之系列之二 代码

MyBatis 解决上篇的参数绑定问题以及XML方式交互

前言 上文:MyBatis 初识简单操作-CSDN博客 上篇文章我们谈到的Spring中如何使用注解对Mysql进行交互 但是我们发现我们返回出来的数据明显有问题 我们发现后面三个字段的信息明显没有展示出来 下面我们来谈谈解决方案 解决方案 这里的原因本质上是因为mysql中和对象中的字段属性…

2024年最受欢迎的 19 个 VS Code 主题排行榜

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

GROBID库文献解析

1. 起因 由于某些原因需要在大量的文献中查找相关内容&#xff0c;手动实在是太慢了&#xff0c;所以选择了GROBID库进行文献批量解析 2. GROBID介绍 GROBID是一个机器学习库&#xff0c;用于将PDF等原始文档提取、解析和re-structuring为结构化的XML/TEI编码文档&#xff0…

pytorch yolov5+Deepsort实现目标检测和跟踪+单目测距

最近一直在整理单目测距的内容&#xff0c;想着检测单目测距都写完了&#xff0c;顺手也写个检测跟踪单目测距&#xff0c;算是总结下这部分内容吧&#xff0c;如果有错误&#xff0c;还请不吝赐教&#xff01;&#xff01; 参考文献: YOLOv5DeepSort实现目标跟踪 pytorch yolo…

郭天祥新概念51单片机(第四期读书笔记)

时钟周期、状态周期、机器周期、指令周期与晶振频率之间的关系 1、晶振频率与脉冲的关系 假设单片机的晶振频率是12MHz&#xff0c;那么它的一个脉冲为1/12微秒&#xff1b;晶振单位时间发出的脉冲则为&#xff1a; 12 ∗ 1 0 6 12*10^6 12∗106。 假设单片机的晶振频率是4MH…

Python 音频处理工具库之pydub使用详解

概要 在音频处理领域,Python pydub 库是一个功能强大且易于使用的工具,它可以帮助开发者处理音频文件的各种操作,如剪切、合并、转换格式、调整音量等。本文将详细介绍 pydub 库的功能、用法以及一些实际应用案例,帮助大家更好地了解和使用这个强大的音频处理工具。 什么是…

数据守护者:揭秘备份数据的终极策略

在数字化日益深入的今天&#xff0c;备份数据的重要性不言而喻。无论是个人用户还是企业机构&#xff0c;数据都是最宝贵的资产之一。一旦数据丢失或受损&#xff0c;可能会导致无法挽回的损失&#xff0c;甚至影响业务的正常运转。因此&#xff0c;备份数据成为了一种必要的安…

Linux中查看文件内容的命令

文章目录 一、七类常见的Linux的文件二、显示命令三、分页显示四、显示文件前后内容五、压缩、解压缩六、补充 一、七类常见的Linux的文件 字符文件类型-普通文件&#xff0c;包括纯文本文件、二进制文件、各种压缩文件等。在find命令中&#xff0c;type 选项中用 f来表示d目录…

B站海外商业化探索之路

本期作者 背景 业务背景 B站&#xff08;bilibili&#xff09;出海以来&#xff0c;深耕内容生态和用户播放体验&#xff0c;业务发展逐渐步入正轨&#xff0c;用户体量稳中有升&#xff0c;目前在东南亚视频APP领域占领了一定的市场份额。 如何探索和实施商业化策略&#xff…

搜维尔科技:Manus Prime 3 Mocap数据手套,体验极致的每指触觉!

完全适用于VR虚拟现实场景 特斯拉也在使用的量子数据 Tesla 目前正在使用 MANUS Quantum Metagloves创建一个数据集&#xff0c;帮助他们训练 Tesla 机器人。 量子数据训练QUANTUM AI 我们以类似的方式使用 Quantum Metagloves 来生成一流的手指跟踪数据集&#xff0c;并将其…

GoogleNet神经网络介绍

一、简介 GoogleNet&#xff0c;也称为GoogLeNet&#xff0c;是谷歌工程师设计的一种深度神经网络结构&#xff0c;它在2014年的ImageNet图像识别挑战赛中取得了冠军。该神经网络的设计特点主要体现在其深度和宽度上&#xff0c;通过引入名为Inception的核心子网络结构&#x…

RWKV_Pytorch:支持多硬件适配的开源大语言模型推理框架

亲爱的技术探索者们&#xff0c;今天我要向大家隆重推荐一个在开源社区中崭露头角的项目——RWKV_Pytorch。这是一个基于Pytorch的RWKV大语言模型推理框架&#xff0c;它不仅具备高效的原生Pytorch实现&#xff0c;而且还扩展了对多种硬件的适配支持&#xff0c;让模型的部署和…

应用方案 | D358 高增益运算放大器,可以用于音频放大器、工业控制、DC 增益部件和所有常规运算放大电路

一、概述 D358 由两个独立的高增益运算放大器组成。可以是单电源工作&#xff0c;也可以是双电源工作&#xff0c;电源低功耗电流与电源电压大小无关。 应用范围包括音频放大器、工业控制、DC 增益部件和所有常规运算放大电路。 D358 采用 DIP8、SOP8、MSOP8 和 TSSOP8 的封装形…

振弦采集仪在地铁工程中的应用与地下结构监测

振弦采集仪在地铁工程中的应用与地下结构监测 随着城市化的快速发展&#xff0c;地铁成为现代城市交通体系的重要组成部分。地铁工程在建设过程中需要进行严格的地下结构监测&#xff0c;以确保施工过程的安全和工程质量的控制。振弦采集仪作为一种先进的监测设备&#xff0c;…

vim编辑器使用教程

前言 vim 是 Linux 系统内置的「文本编辑器」&#xff0c;用于查看或编辑文件的内容&#xff0c;学会使用 vim 编辑器&#xff0c;将在 Linux 终端中畅通无阻。 vim 的配置文件 1、 /etc/vim/vimrc 2、 ~/.vimrc 其中&#xff0c;第2个配置文件会优先加载&#xff0c;属于用…

网络套接字补充——TCP网络编程

六、TCP网络编程 6.1IP地址字符串和整数之间的转换接口 //字符串转整数接口 #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int inet_aton(const char *cp, struct in_addr *inp); int inet_pton(int af, const char *strptr, …

SWM341系列SDRAM应用

SWM341系列SDRAM应用 1、不同的时钟频率下&#xff0c;SDRAM的初始化参数设置 现象&#xff1a;驱屏应用&#xff0c;显示一段时间后出现卡住的现象 分析&#xff1a;SDRAM的初始 化参数优化 主频150Mhz,建议配置CASL 3&#xff0c;TRFC ≥8。 主频100Mhz,ClkDiv可配置为1…