【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的值自然也就出来了。

小结

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

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

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

相关文章

动态规划(记忆化搜索)

AcWing 901. 滑雪 给定一个 R行 C 列的矩阵&#xff0c;表示一个矩形网格滑雪场。 矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。 一个人从滑雪场中的某个区域内出发&#xff0c;每次可以向上下左右任意一个方向滑动一个单位距离。 当然&#xff0c;一个人能…

鸿蒙跨平台框架来了ArkUi-X

前言&#xff1a; 各位同学大家有段时间没有给大家更新博客了 之前鸿蒙推出了鸿ArkUi-X 框架所以就写个文章分享一下 效果图&#xff1a; 首先需要下载支持 ArkUI-X 套件的华为开发工具 DevEco &#xff0c;版本为 4.0 以上&#xff0c;目前可以下载预览版进行体验。下载地址…

Node.js与npm版本比对

Node.js与npm版本比对 Node.js与npm版本比对版本对比表Node版本对比 Node.js与npm版本比对 我们在项目开发过程中&#xff0c;经常会遇到公司一些老的前端工程项目&#xff0c;而我们当前的node及npm版本都是相对比较新的了。 在运行以前工程时&#xff0c;会遇到相关环境不匹…

宝塔Python3.7安装模块报错ModuleNotFoundError: No module named ‘Crypto‘解决办法

前言 今晚遇到一个问题&#xff0c;宝塔服务器上安装脚本的模块时&#xff0c;出现以下报错&#xff0c;这里找到了解决办法 Traceback (most recent call last):File "/www/wwwroot/unifysign/fuck_chaoxing/fuck_xxt.py", line 4, in <module>from Crypto.…

WORD中的表格内容回车行距过大无法调整行距

word插入表格&#xff0c;编辑内容&#xff0c;换行遇到如下问题&#xff1a; 回车后行距过大&#xff0c;无法调整行距。 解决方法&#xff08;并行&#xff09;&#xff1a; 方法1&#xff1a;选中要调整的内容&#xff0c;菜单路径&#xff1a;“编辑-清除-格式” 方法2&am…

解读BOT攻击,探索灵活且准确的安全之道

车票、秒杀、限量球鞋……面对这样的抢购场景&#xff0c;为什么总是落后于人&#xff1f;其实你遇到的并不是真人&#xff0c;而是恶意BOT。恶意的BOT进行信息数据爬取、薅羊毛等攻击行为&#xff0c;正损害着企业和用户的利益。在过去 5 年&#xff0c;几乎每个企业都会遇到由…

JVM相关面试题(每日一练)

1. 什么是垃圾回收机制&#xff1f; 垃圾收集 Garbage Collection 通常被称为“GC”&#xff0c;它诞生于1960年 MIT 的 Lisp 语言&#xff0c;经过半个多世纪&#xff0c;目前已经十分成熟了。 jvm 中&#xff0c;程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭&a…

Git(二)版本控制、发展历史、初始化配置、别名

目录 一、版本控制1.1 为什么要使用版本控制&#xff1f;1.2 集中化的版本控制系统1.3 分布式的版本控制系统1.3 两种版本控制系统对比集中式&#xff08;svn&#xff09;分布式&#xff08;git&#xff09; 二、发展历史三、初始化配置3.1 配置文件3.2 配置内容 四、别名 官网…

esp32-C3固件烧录用户手册

esp32-C3固件烧录用户手册1.4 文章目录 esp32-C3固件烧录用户手册1.4烧录所需硬件软件工具vscodeplatformIOflash_download_tools 插座与USB转TTL模块之间接线esp32-C3版本插座&#xff08;底板4针&#xff09; bin固件和烧录地址获取详细烧录地址和信息获取文件系统程序详细烧…

输入/输出应用程序接口和设备驱动程序接口

文章目录 1.输入/输出应用程序接口1.字符设备接口2.块设备接口3.网络设备接口1.网络设备套接字通信 4.阻塞/非阻塞I/O 2.设备驱动程序接口1.统一标准的设备驱动程序接口 1.输入/输出应用程序接口 1.字符设备接口 get/put系统调用:向字符设备读/写一个字符 2.块设备接口 read/wr…

Android拖放startDragAndDrop拖拽onDrawShadow动态添加View,Kotlin(3)

Android拖放startDragAndDrop拖拽onDrawShadow动态添加View&#xff0c;Kotlin&#xff08;3&#xff09; import android.content.ClipData import android.graphics.Canvas import android.graphics.Point import android.os.Bundle import android.util.Log import android.…

酷开科技 | 酷开系统大屏电视,打造精彩家庭场景

在信息资讯不发达的年代&#xff0c;电视机一直都是个人及家庭重要的信息获取渠道和家庭娱乐中心&#xff0c;是每个家庭必不可少的大家电之一&#xff01;在快节奏的现代生活中&#xff0c;受手机和平板的冲击&#xff0c;电视机这个曾经的客厅“霸主”一度失去了“主角光环”…

低概率Bug,研发敷衍说复现不到

测试工作中&#xff0c;经常会遇到一些低概率出现的问题&#xff0c;如果再是个严重问题&#xff0c;那测试人员的压力无疑是很大的&#xff0c;一方面是因为低概率难以复现&#xff0c;另一面则是来自项目组的压力。 如何在测试时减少此类问题的重复投入&#xff0c;我的思考如…

SAP ABAP 报表输出成 excel 统计图形 (RFC : GFW_PRES_SHOW_MULT)

SAP 预设了一个类型组 GFW &#xff0c;做简单的excel图形输出 话不多说&#xff0c;直接上代码&#xff1a; *&---------------------------------------------------------------------* *& Report ZCYCLE057 *&----------------------------------------------…

C语言之指针详解

目录 地址 指针的定义和使用 数组与指针的区别与联系 字符串与指针的用法 C 中的 NULL 指针 指针的算术运算 指向指针的指针 传递指针给函数 从函数返回指针 在学习指针之前&#xff0c;我们先弄清楚一个概念&#xff1a; 地址 地址在计算机内存中是一个唯一的标识符…

debian 10 安装apache2 zabbix

nginx 可以略过&#xff0c;改为apache2 apt updateapt-get install nginx -ynginx -v nginx version: nginx/1.14.2mysql 安装参考linux debian10 安装mysql5.7_debian apt install mysql5.7-CSDN博客 Install and configure Zabbix for your platform a. Install Zabbix re…

Three.js 基础纹理贴图

本文简介 带尬猴&#xff0c;我嗨德育处主任 尽管 Three.js 文档已经比较详细了&#xff0c;但对于刚接触 Three.js 的工友来说&#xff0c;最麻烦的还是不懂如何组合。Three.js 的功能实在太多了&#xff0c;初学者很容易被大量的新概念冲晕。 本文主要讲解入门 Three.js 必…

LeetCode 热题 100 - 第1题:两数之和

LeetCode 热题 100 - 第1题:两数之和 原题题目理解普通的解题思路---遍历查找进阶的解题思路---哈希查找 原题 给定一个整数数组 nums和一个整数目标值target&#xff0c;请你在该数组中找出 和为目标值 target的那两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种…

Python深度学习实战-基于class类搭建BP神经网络实现分类任务(附源码和实现效果)

实现功能 上篇文章介绍了用Squential搭建BP神经网络&#xff0c;Squential可以搭建出上层输出就是下层输入的顺序神经网络结构&#xff0c;无法搭出一些带有跳连的非顺序网络结构&#xff0c;这个时候我们可以选择类class搭建封装神经网络结构。 第一步&#xff1a;import ten…

【C++进阶之路】第三篇:二叉搜索树 kv模型

文章目录 一、二叉搜索树1.二叉搜索树概念2.二叉搜索树操作3.二叉搜索树的实现 二、二叉搜索树的应用1.kv模型2.kv模型的实现 三、 二叉搜索树的性能分析 一、二叉搜索树 1.二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性…
最新文章