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

【vector题解】杨辉三角 | 删除有序数组中的重复项 | 只出现一次的数字Ⅱ

杨辉三角

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

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

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

示例 1:

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

示例 2:

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

知识点

这道题涉及的知识点有:1. vector创建二维数组。 2. 杨辉三角的表示法。

vector如何创建数组?

创建一维数组的方法:

vector<int> v(5);  //创建5个int,初始化成默认值0
​
vector<int> v(5,1);  //创建5个int,初始化成1
​
vector<int> v={1,2,3};  //创建3个int,分别是1,2,3

创建二维数组的方法:

vector<vector<int>>(5);    //创建5行。 若想要定义列的大小,用resize()
​
vector<vector<int>>(5,vector<int>(4));   //创建5行4列,初始化成默认值0
​
vector<vector<int>>(5,vector<int>(4,9));  //创建5行4列,初始化成默认值9

这道题的二维数组,每行的大小都不一样的:

大小我们用resize()去调整。

至于杨辉三角的表示法,它的规律是:每行的开头和末尾为1,其他的数之间的关系 用找规律法可以得出:v[i] [j]=v[i-1] [j-1] + v[i-1] [j]

解答

class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> v(numRows); for(int i=0;i<numRows;i++){v[i].resize(i+1);v[i][0]=v[i][i]=1;for(int j=1;j<i;j++){v[i][j]=v[i-1][j-1]+v[i-1][j];}}return v;}
};

删除有序数组中的重复项

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

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

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

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

  • 返回 k

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [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]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

思路与实现

这道题我想到了两个思路。

思路一:

设两个迭代器:fast、slow。它们初始都指向nums的第一个元素。

fast一步一步地持续往前走,slow暂时待在原地。每当fast指向的元素和slow指向的不一样,就让slow加加,把fast的值赋给slow。

class Solution {
public:int removeDuplicates(vector<int>& nums) {vector<int>::iterator fast=nums.begin(),slow=nums.begin();while(fast!=nums.end()){if(*fast!=*slow){slow++;*slow=*fast;}fast++;}int k=slow-nums.begin()+1;nums.resize(k);return k;}
};

思路二:

把数组遍历一遍,遇到和上一个相同的就删除。

class Solution {
public:int removeDuplicates(vector<int>& nums) {vector<int>::iterator it=nums.begin();while(it!=nums.end()){if(it+1!=nums.end()){   //小心越界,加个判断if(*it==*(it+1)){it=nums.erase(it);}else{it++;}}else{it++;}}int k=nums.size();return k;}
};

这个思路二挺容易写错的,看看我之前的错误写法:

class Solution {
public:int removeDuplicates(vector<int>& nums) {vector<int>::iterator it=nums.begin();while(it!=nums.end()){if(it+1!=nums.end()){if(*it==*(it+1)){   //如果it没走这里的if条件,那它也没法自增,程序就陷入死循环了it=nums.erase(it);}}else{it++;}}int k=nums.size();return k;}
};

这样写的问题,还是出在erase那边。之前我强调过,erase因为会引起迭代器失效,所以写法非常讲究。

正确的erase写法:

要用if else语句,并且要用迭代器去承接erase的返回值。

而这里,我只写了if,漏写了else。在else里,it要加加。

错误记录

这样写,为什么报错呢?

class Solution {
public:int removeDuplicates(vector<int>& nums) {int sz=nums.size();int i=0;while(i<sz){if(i>0){if(nums[i]==nums[i-1]){vector<int>::iterator pos=nums.begin()+i;pos=nums.erase(pos);   //这里要考虑迭代器失效吗?}else{i++;}}else{i++;}   }int k=nums.size();return k;}
};

原来,是因为我循环里的erase操作,会导致size()被修改,sz的值失效了。

只出现一次的数字Ⅱ

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

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

示例 1:

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

示例 2:

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

思路

这道题乍一看,长得像单身狗问题,但实际并不能用异或的方法去做,两个相同的值异或在一起为0,而这里是三个相同的值。

思路一:先排序,再前后比较

这题其实可以借鉴刚刚那道“删除数组中的重复项”,把乱序的数组排序,使得大小相同的数字紧挨在一起,当一个数和前后都不相同,那这个数就只出现了一次。

class Solution {
public:int singleNumber(vector<int>& nums) {int sz=nums.size();//首先要考虑特殊情况if(sz==1){return nums[0];}sort(nums.begin(),nums.end());for(int i=0;i<sz;i++){//先考虑第一个和最后一个,这俩位置比较尴尬,容易越界访问if(i==0&&nums[i]!=nums[i+1]){return nums[i];}else if(i==sz-1&&nums[i]!=nums[i-1]){return nums[i];}else if(nums[i]!=nums[i+1]&&nums[i]!=nums[i-1]){return nums[i];}}return 0;}
};

思路二:位运算

先撇开那个只出现一次的数字不看(我们就叫它A),其他数字都是三个三个出现的。

此时将十进制的数字用二进制的视角来看的话,32个比特位,1出现的次数一定是3的倍数。

而加进来A以后,我们将目光投到任意一个比特位上。如果A的这个比特位是0,那1的次数依然是3的倍数;如果是1,那这个次数模3等于1。

也就是说,我们可以通过1的次数 倒推出A的 其中一个比特位了:设1出现x次,x%3==0,那A的这一位就是0;x%3 ==1,这一位就是1。

A一共有32个比特位,复刻这个方法,可以推出A的每一个比特位,A的值自然也就出来了。

class Solution {
public:int singleNumber(vector<int>& nums) {//一共32个比特位,每一位的0、1值我们都要获知int ret=0;for(int i=0;i<32;i++){//统计1出现的次数nint n=0;for(int num:nums){if((num>>i)&1==1){n++;}}if(n%3==1){ret|=1<<i;   //注意:二进制的加法就用|}            //刚刚右移了i位,现在再左移回来}return ret;}
};

小结

1.“去重”问题往往可以考虑先排个序。

2.按位或 相当于是二进制中的加法。

相关文章:

【vector题解】杨辉三角 | 删除有序数组中的重复项 | 只出现一次的数字Ⅱ

杨辉三角 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1…...

金字塔切分注意力模块PSA学习笔记 (附代码)

已有研究表明&#xff1a;将注意力模块嵌入到现有CNN中可以带来显著的性能提升。比如&#xff0c;SENet、BAM、CBAM、ECANet、GCNet、FcaNet等注意力机制均带来了可观的性能提升。但是&#xff0c;目前仍然存在两个具有挑战性的问题需要解决。一是如何有效地获取和利用不同尺度…...

Jenkins自动化测试

学习 Jenkins 自动化测试的系列文章 Robot Framework 概念Robot Framework 安装Pycharm Robot Framework 环境搭建Robot Framework 介绍Jenkins 自动化测试 1. Robot Framework 概念 Robot Framework是一个基于Python的&#xff0c;可扩展的关键字驱动的自动化测试框架。 它…...

python 字典dict和列表list的读取速度问题, range合并

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 python 字典和列表的读取速度问题 最近在进行基因组数据处理的时候&#xff0c;需要读取较大数据&#xff08;2.7G&#xff09;存入字典中&#xff0c; 然后对被处理数据进行字典key值的匹配&#xff0c;在被处理文件中每次…...

测试用例的设计方法(全):等价类划分方法

一.方法简介 1.定义 是把所有可能的输入数据,即程序的输入域划分成若干部分&#xff08;子集&#xff09;,然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。 2.划分等价类&#xff1a; 等价类是指某个输入域的…...

Office技巧(持续更新)(Word、Excel、PPT、PowerPoint、连续引用、标题、模板、论文)

1. Word 1.1 标题设置为多级列表 选住一级标题&#xff0c;之后进行“定义新的多级列表” 1.2 图片和表的题注自动排序 正常插入题注后就可以了。如果一级标题是 “汉字序号”&#xff0c;那么需要对题注进行修改&#xff1a; 从原来的 图 { STYLEREF 1 \s }-{ SEQ 图 \* A…...

Java实现ORM第一个api-FindAll

经过几天的业余开发&#xff0c;今天终于到ORM对业务api本身的实现了&#xff0c;首先实现第一个查询的api 老的C#定义如下 因为Java的泛型不纯&#xff0c;所以无法用只带泛型的方式实现api&#xff0c;对查询类的api做了调整&#xff0c;第一个参数要求传入实体对象 首先…...

HFSS笔记——求解器和求解分析

文章目录 1、求解器2、求解类型3、自适应网格剖分4、求解频率选择4.1 求解设置项的含义4.2 扫频类型 1、求解器 自从ANSYS将HFSS收购后&#xff0c;其所有的求解器都集成在一起了&#xff0c;点击Project&#xff0c;会显示所有的求解器类型。 其中&#xff0c; HFSS design&…...

jenkins配置gitlab凭据

下载Credentials Binding插件&#xff08;默认是已经安装了&#xff09; 在凭据配置里添加凭据类型 点击保存 Username with password&#xff1a; 用户名和密码 SSH Username with private 在凭据管理里面添加gitlab账号和密码 点击全局 点击添加凭据&#xff08;版本不同…...

0基础学习PyFlink——用户自定义函数之UDTF

大纲 表值函数完整代码 在《0基础学习PyFlink——用户自定义函数之UDF》中&#xff0c;我们讲解了UDF。本节我们将讲解表值函数——UDTF 表值函数 我们对比下UDF和UDTF def udf(f: Union[Callable, ScalarFunction, Type] None,input_types: Union[List[DataType], DataTy…...

【Java 进阶篇】Java Request 原理详解

在网络应用开发中&#xff0c;HTTP请求是一项常见而关键的任务。当我们使用Java编写网络应用时&#xff0c;了解HTTP请求的工作原理变得至关重要。本文将详细介绍Java中HTTP请求的原理&#xff0c;包括请求的结构、发送请求的方法以及处理请求的过程。 HTTP请求的基本结构 HT…...

13 结构性模式-装饰器模式

1 装饰器模式介绍 在软件设计中,装饰器模式是一种用于替代继承的技术,它通过一种无须定义子类的方式给对象动态的增加职责,使用对象之间的关联关系取代类之间的继承关系. 2 装饰器模式原理 //抽象构件类 public abstract class Component{public abstract void operation(); }…...

支持向量机(SVM)

一. 什么是SVM 1. 简介 SVM&#xff0c;曾经是一个特别火爆的概念。它的中文名&#xff1a;支持向量机&#xff08;Support Vector Machine, 简称SVM&#xff09;。因为它红极一时&#xff0c;所以关于它的资料特别多&#xff0c;而且杂乱。虽然如此&#xff0c;只要把握住SV…...

Rabbitmq----分布式场景下的应用

服务异步通信-分布式场景下的应用 如果单机模式忘记也可以看看这个快速回顾rabbitmq,在做学习 消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1.消息可靠性 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一…...

springboot + redis实现签到与统计功能

在很多项目中都会有签到与统计功能&#xff0c;最容易想到的方案是创建一个签到表来记录每个用户的签到记录&#xff0c;比如设计一个mysql数据库表&#xff1a; CREATE TABLE tb_sign id bigint(20) unsigned NOT NULL AUTOINCREMENT COMMENT 主键, user_id bigint(20) unsig…...

Redis | 数据结构(02)SDS

一、键值对数据库是怎么实现的&#xff1f; 在开始讲数据结构之前&#xff0c;先给介绍下 Redis 是怎样实现键值对&#xff08;key-value&#xff09;数据库的。 Redis 的键值对中的 key 就是字符串对象&#xff0c;而 value 可以是字符串对象&#xff0c;也可以是集合数据类型…...

Linux C语言开发-D7D8运算符

算术运算符&#xff1a;-*/%&#xff0c;浮点数可以参与除法运算&#xff0c;但不能参与取余运算 a%b&#xff1a;表示取模或取余 关系运算符&#xff1a;<,>,>,<,,! 逻辑运算符:!,&&,|| &&,||逻辑运算符是从左到右&#xff0c;依次运算&#…...

redis 配置主从复制,哨兵模式案例

哨兵(Sentinel)模式 1 . 什么是哨兵模式&#xff1f; 反客为主的自动版&#xff0c;能够自动监控master是否发生故障&#xff0c;如果故障了会根据投票数从slave中挑选一个 作为master&#xff0c;其他的slave会自动转向同步新的master&#xff0c;实现故障自动转义 2 . 原理…...

Python---练习:使用for循环实现用户名+密码认证

案例&#xff1a; 用for循环实现用户登录 ① 输入用户名和密码 ② 判断用户名和密码是否正确&#xff08;usernamelaowang&#xff0c;passwordlw123&#xff09; ③ 登录仅有三次机会&#xff0c;超过3次会报错 思考&#xff1a; 用户登陆情况有3种: ① 用户名错误(此时…...

react中使用jquery 语法

react中使用jquery 语法 npm install jquery引入 import $ from ‘jquery’ import React from react; import ./css/App.css import { Button } from antd; import $ from jquerylet slider_img [https://cdn.jsdelivr.net/gh/xaoxuu/cdn-wallpaper/abstract/41F215B9-261F…...

YOLOv5与DeepSort结合优化:如何调整参数让目标跟踪更精准(附代码对比)

YOLOv5与DeepSort参数调优实战&#xff1a;提升目标跟踪精度的关键策略 在计算机视觉领域&#xff0c;目标跟踪技术正从实验室快速走向工业应用。当基础功能实现后&#xff0c;如何让系统在实际场景中表现更稳定、更精准&#xff0c;成为开发者面临的核心挑战。本文将深入剖析Y…...

【学习笔记】C++(2)

C++学习笔记 三、进阶 —— 类和对象 1、概述 2、基础 —— 公有、私有、保护、构造、析构 3、拷贝构造、临时对象不能绑定到非const引用问题 4、浅拷贝、深拷贝、移动拷贝 5、静态 6、内联和外联 7、链表 8、函数模板和类模板 9、友元 10、继承-派生(1) —— 基础 11、继承-…...

OpenClaw效率对比:Qwen2.5-VL-7B与传统OCR工具在文档处理中的表现

OpenClaw效率对比&#xff1a;Qwen2.5-VL-7B与传统OCR工具在文档处理中的表现 1. 测试背景与动机 最近在整理公司历史项目文档时&#xff0c;遇到了一个棘手的问题&#xff1a;大量扫描版PDF和图片格式的技术文档需要数字化处理。这些文档包含代码片段、手写注释和复杂表格&a…...

联邦蒸馏技术解析:从知识共享到隐私保护的实践路径

1. 联邦蒸馏技术&#xff1a;当知识共享遇上隐私保护 第一次听说"联邦蒸馏"这个词时&#xff0c;我正和团队在做一个医疗AI项目。医院的数据就像被锁在保险箱里的珍宝&#xff0c;谁都想要&#xff0c;但谁都拿不到。传统联邦学习虽然解决了数据不出本地的问题&#…...

SEO标题优化与内容营销的关系是什么

SEO标题优化与内容营销的关系&#xff1a;深度解析与实践指南 在数字营销的世界里&#xff0c;SEO标题优化与内容营销之间的关系日益紧密&#xff0c;两者共同塑造了网站的可见性和用户参与度。究竟SEO标题优化与内容营销的关系是什么呢&#xff1f;本文将深入解析这一关系&am…...

不止于检测:如何用FastAPI和VUE3给你的YOLO行人识别系统加上数据大屏、模型管理和AI聊天?

从算法Demo到商业级系统&#xff1a;基于FastAPI与VUE3的智能检测平台架构实战 当你的YOLO模型能在测试集上跑出漂亮指标时&#xff0c;下一个问题自然浮现&#xff1a;如何让这个算法真正产生业务价值&#xff1f;我们见过太多优秀的检测模型被困在Jupyter Notebook里&#xf…...

AI 术语通俗词典:矩阵乘法

矩阵乘法是线性代数、数据分析、机器学习和人工智能中非常核心的一个术语。它用来描述两组二维数值结构之间的一种特定运算规则。这个运算结果仍然是一个矩阵&#xff0c;但它并不是简单地把对应位置的元素相乘&#xff0c;而是通过“行与列”的组合来生成新的数值。如果说矩阵…...

x86汇编堆栈第二个案例

x86汇编堆栈第二个案例x86汇编堆栈第二个案例 1&#xff09;案例介绍 咱们上节课先把常见的x86下的堆栈过了一遍&#xff0c;包括基本指令对吧&#xff0c;除了上一个案例咱们还可以做什么使用现在学到的内容&#xff1f;既然咱们知道了“后进先出&#xff08;LIFO&#xff09;…...

DFX测试与专项测试:非功能性测试的深度解析与实践指南

1. DFX测试&#xff1a;产品全生命周期的质量守护者 第一次接触DFX测试这个概念时&#xff0c;我也被这个缩写搞懵了。后来在实际项目中才发现&#xff0c;这其实就是把质量保障前置到设计阶段的绝佳实践。DFX中的"X"就像是个万能变量&#xff0c;可以代入产品生命周…...

Java全栈工程师的面试实战:从技术细节到业务场景

Java全栈工程师的面试实战&#xff1a;从技术细节到业务场景 在一次真实的互联网大厂Java全栈开发岗位的面试中&#xff0c;一位名叫李明的候选人&#xff0c;年龄28岁&#xff0c;拥有计算机科学与技术硕士学历&#xff0c;工作年限为5年。他曾在一家知名的电商公司担任全栈开…...