c++:vector的相关oj题(136. 只出现一次的数字、118. 杨辉三角、26. 删除有序数组中的重复项、JZ39 数组中出现次数超过一半的数字)

文章目录

  • 1. 136. 只出现一次的数字
    • 题目详情
    • 代码(直接来异或)
    • 思路
  • 2. 118. 杨辉三角
    • 题目详情
    • 代码1
    • 思路
    • 代码2
    • 思路2
  • 3. 26. 删除有序数组中的重复项
    • 题目详情
    • 代码
    • 思路
  • 4. JZ39 数组中出现次数超过一半的数字
    • 题目详情
    • 代码1(暴力)
    • 思路1
    • 代码2(Boyer-Moore 投票算法)
    • 思路2

1. 136. 只出现一次的数字

传送门

题目详情

在这里插入图片描述

代码(直接来异或)

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        //根据:某个元素只出现一次   直接来异或
        int ret=0;
        for(auto e:nums)
        {
            ret=ret^e;
        }
        return ret;
    }
};

思路

  1. 异或运算的性质:异或运算(^)具有以下性质**(相同为0,相异为1)**
    • 任何数和0做异或运算,结果仍然是原来的数:a ^ 0 = a
    • 任何数和自身做异或运算,结果为0:a ^ a = 0
    • 异或运算满足交换律和结合律:a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
  2. 利用异或运算的性质:如果一个数出现两次,那么两次出现的数异或后结果为0;如果一个数只出现一次,那么异或后结果为该数本身。
  3. 利用上述性质,遍历nums中的所有元素,并进行异或运算,最终得到的结果就是只出现一次的元素。
    在这里插入图片描述

2. 118. 杨辉三角

传送门

题目详情

在这里插入图片描述

代码1

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> vv;
        vv.resize(numRows);//先给好numRows个元素,即vv里能存vector<int>
        for(int i=0;i<numRows;i++)//对一行进行处理
        {
            vv[i].resize(i+1);//每一行里再开好对应的大小
            vv[i].front()=vv[i].back()=1;//最左最右都是1
        }

        for(int i=2;i<numRows;i++)
         {
             for(int j=1;j<i;j++)
             {
                 vv[i][j]=vv[i-1][j-1]+vv[i-1][j];
             }
         }
        return vv;
    }
};

在这里插入图片描述

思路

  1. 创建一个二维vector vv,用于存储杨辉三角的数据。vv的第i行第j列的元素表示杨辉三角中第i行第j列的数值。

  2. 首先,通过vv.resize(numRows)vv分配了numRows个元素,即vv中可以存储numRows行的vector(即numRows个vector)

  3. 对于每一行,通过vv[i].resize(i+1)为其分配了合适的大小,即第i行有i+1个元素。(从0开始)

  4. 对于每一行的第一个和最后一个元素,将其赋值为1,因为杨辉三角的每一行的两端都是1。

  5. 最后,对于第三行及以上的每一行,利用杨辉三角的性质,即第i行第j列的数值等于第i-1行第j-1列和第j列的数值之和,来计算每一行的中间元素的值。

    例如,第i行第j列的元素等于第i-1行第j-1列和第i-1行第j列的元素之和,即vv[i][j] = vv[i-1][j-1] + vv[i-1][j]

    通过以上步骤,最终得到了杨辉三角的前numRows行。

举个例子:
如果numRows为5,那么vv的内容将会是:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

代码2

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> vv;
        vv.resize(numRows);//先给好numRows个元素,即vv里能存vector<int>
        for(int i=0;i<numRows;i++)//对一行进行处理
        {
            vv[i].resize(i+1,0);//每一行里再开好对应的大小
            vv[i].front()=vv[i].back()=1;//最左最右都是1
        }

        for(int i=0;i<numRows;i++)
        {
            for(int j=0;j<vv[i].size();j++)
            {
                if(vv[i][j]==0)
                vv[i][j]=vv[i-1][j-1]+vv[i-1][j];
            }
        }
        return vv;
    }
};

思路2

大致都一样,不过在进行相加这里头和尾也都算上,因为在一开始开空间,全都给0了。
能多加一个条件判断,不怕越界
在这里插入图片描述

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

传送门

题目详情

在这里插入图片描述

代码

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size()==0)//处理0的情况
        {
            return 0;
        }
        int index=1;
        int pre_index=0;
        while(index<nums.size())//如果就一个元素,根本不会进来
        {
            if(nums[index]!=nums[pre_index])
            {
                nums[pre_index+1]=nums[index];//赋值给下一个后加一,就是新位置了,再用后面的来比
                pre_index++;
            }
            index++;
        }
        return pre_index+1;//下标加1才是元素个数
    }
};

思路

这里需要注意,给出的数组是总体上是升序

  1. 首先检查数组是否为空,如果是空数组则直接返回0,因为没有重复元素。

  2. 定义两个指针index pre_index,分别代表当前遍历的元素和上一个不重复元素的位置。index 初始值为1,因为我们从第二个元素开始遍历;pre_index 初始值为0,因为第一个元素肯定是不重复的

  3. 循环遍历数组,从第二个元素开始。如果当前元素与上一个不重复元素不相同,就将当前元素放在上一个不重复元素的下一个位置,并将 pre_index 更新为当前的位置(新的不重复元素的位置)

  4. 最后返回 pre_index+1,即为不重复元素的数量
    在这里插入图片描述

4. JZ39 数组中出现次数超过一半的数字

传送门

题目详情

在这里插入图片描述

代码1(暴力)

    int MoreThanHalfNum_Solution(vector<int>& numbers) {
        // write code here
        int half=numbers.size()/2;
        for(int i=0;i<numbers.size();i++)
        {
            int count=0;
            for(int j=i+1;j<numbers.size();j++)
            {
                if(numbers[i]==numbers[j])
                {
                    count++;
                }
                if(count>=half)
                {
                    return numbers[i];
                }
            }
        }
        return numbers[0];
    }
};

思路1

暴力运用两次循环,对每个元素进行统计,大家都知道效率肯定很差。
下面看第二个

代码2(Boyer-Moore 投票算法)

    int MoreThanHalfNum_Solution(vector<int>& numbers) {
        // write code here
        int count = 0;
        int candidate=numbers[0];//一开始就假设第一个是候选者

        for (auto num : numbers) {
            if (count == 0) {
                candidate = num;
            }
            count += (num == candidate) ? 1 : -1;//相等就+1,不等-1
        }

        return candidate;
    }
};

思路2

摩尔投票法的核心思想是抵消。在遍历数组时,我们维护一个候选元素和一个计数器。遍历过程中,如果计数器为0,就将当前元素设为候选元素;如果遇到与候选元素相同的元素,则计数器加1,否则计数器减1。这样做的原因是,如果某个元素出现的次数超过数组长度的一半,那么它与其他元素出现次数的抵消会导致最终留下的候选元素就是出现次数超过一半的元素。

让我们通过一个例子来说明这个过程:

假设数组为:[3, 3, 4, 2, 4, 4, 2, 4, 4]。

我们用变量candidate来存储候选元素,用变量count来存储候选元素的计数器。

  1. 我们从数组的第一个元素开始,即3。此时候选元素为3,计数器为1。
  2. 继续遍历数组,遇到的下一个元素还是3。此时计数器变为2。
  3. 继续遍历数组,遇到的下一个元素是4。此时计数器变为1。
  4. 继续遍历数组,遇到的下一个元素是2。此时计数器变为0。
  5. 继续遍历数组,遇到的下一个元素是4。此时候选元素变为4,计数器变为1。
  6. 继续遍历数组,遇到的下一个元素是4。此时计数器变为2。
  7. 继续遍历数组,遇到的下一个元素是2。此时计数器变为1。
  8. 继续遍历数组,遇到的下一个元素是4。此时计数器变为2。
  9. 继续遍历数组,遇到的下一个元素是4。此时计数器变为3。

最终留下的候选元素是4,它出现的次数超过了数组长度的一半。

这就是摩尔投票法的原理:通过抵消的过程,最终留下的候选元素就是出现次数超过一半的元素。
在这里插入图片描述


今天就到这里啦!

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

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

相关文章

A Visual Guide to Mamba and State Space Models

用于语言建模的 Transformers 的替代方案 Transformer 架构一直是大型语言模型 &#xff08;LLMs&#xff09; 成功的主要组成部分。它已被用于当今几乎所有LLMs正在使用的产品&#xff0c;从 Mistral 等开源模型到 ChatGPT 等闭源模型。 为了进一步改进LLMs&#xff0c;开发…

【HarmonyOS】鸿蒙开发之Stage模型-基本概念——第4.1章

Stage模型-基本概念 名词解释 AbilityStage:应用组件的“舞台“ UIAbility:包含UI界面的应用组件&#xff0c;是系统调度的基本单元 WindowStage:组件内窗口的“舞台“ Window&#xff1a;用来绘制UI页面的窗口 HAP:Harmony Ability Package(鸿蒙能力类型的包) HSP:Harmony Sh…

【算法 - 动态规划】找零钱问题Ⅰ

在前面的动态规划系列文章中&#xff0c;关于如何对递归进行分析的四种基本模型都介绍完了&#xff0c;再来回顾一下&#xff1a; 从左到右模型 &#xff1a;arr[index ...] 从 index 之前的不用考虑&#xff0c;只考虑后面的该如何选择 。范围尝试模型 &#xff1a;思考 [L ,…

C++——二叉搜索树

二叉搜索树 二叉搜索树&#xff1a; 又为搜索二叉树&#xff0c;一般具有以下的性质 若它的左子树不为空&#xff0c;则左子树上所有的节点的值都小于父亲节点若它的右子树不为空&#xff0c;则右子树上所有的节点的值都大于父亲节点它的左右子树也都为二叉搜索树 二叉搜索树…

Vue前端实现一个本地消息队列(MQ), 让消息延迟消费或者做缓存

MQ功能实现的具体代码(TsMQ.ts)&#xff1a; import { v4 as uuidx } from uuid;import emitter from /utils/mittclass Message {// 过期时间&#xff0c;0表示马上就消费exp: number;// 消费标识&#xff0c;避免重复消费tag : string;// 消息体body : any;constructor( exp…

Docker基础篇(六) dockerfile体系结构语法

FROM&#xff1a;基础镜像&#xff0c;当前新镜像是基于哪个镜像的 MAINTAINER &#xff1a;镜像维护者的姓名和邮箱地址 RUN&#xff1a;容器构建时需要运行的命令 EXPOSE &#xff1a;当前容器对外暴露出的端口号 WORKDIR&#xff1a;指定在创建容器后&#xff0c;终端默认登…

python中的类与对象(1)

目录 一. 引子&#xff1a;模板 二. 面向过程与面向对象 &#xff08;1&#xff09;面向过程编程 &#xff08;2&#xff09;面向对象编程 三. 对象与类 &#xff08;1&#xff09;对象 &#xff08;2&#xff09;类 四. 面向对象程序设计的特点&#xff1a;封装&#…

daydayEXP: 支持自定义Poc文件的图形化漏洞利用工具

daydayEXP: 支持自定义Poc文件的图形化漏洞利用工具 基于java fx写的一款支持加载自定义poc文件的、可扩展的的图形化渗透测试框架。支持批量漏洞扫描、漏洞利用、结果导出等功能。 使用 经过测试,项目可在jdk8环境下正常使用。jdk11因为缺少一些必要的组件,所以jdk11版本工…

sqli-labs第46关

注&#xff1a;说明借鉴&#xff08;现阶段水平不够&#xff0c;只能靠借鉴来完成本次作业&#xff0c;若侵权&#xff0c;必删&#xff09; 基于Sqli-Labs靶场的SQL注入-46~53关_sqli-lab less46-CSDN博客 SQL-Labs46关order by注入姿势-CSDN博客 一、首先需要sql-labs的环…

计算机设计大赛 深度学习图像风格迁移

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

StringBuffer StringBuilder

String 为什么StringBuilder是线程不安全的&#xff1f;StringBuffer是线程安全的&#xff1f; - Jacian - 博客园 (cnblogs.com) StringBuilder 线程安全的可变字符学序列 速度快 StringBuffer 线程不安全的可变字符序列 创建StringBuilder对象 new StringBuilder&…

【Java程序员面试专栏 算法思维】二 高频面试算法题:二分查找

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊二分查找,包括基础二分,寻找目标值的左右边界,搜索旋转数组以及波峰,以及x的平方根问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空…

BlackWidow靶场

kali&#xff1a;192.168.223.128 主机发现 nmap -sP 192.168.223.0/24 目标IP:192.168.223.153 端口扫描 nmap -sV -p- -A 192.168.223.153 22/tcp open ssh OpenSSH 7.9p1 Debian 10deb10u2 (protocol 2.0) 80/tcp open http Apache httpd 2.4.38 ((Deb…

【C++】类与对象——友元,内部类,匿名对象

类与对象 1 友元1.1 概念&#xff1a;1.2 友元函数1.3 友元类 2 内部类概念&#xff1a;特性&#xff1a;举例&#xff1a; 3 匿名对象Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&#xff01;&am…

定制红酒:设计专属标签与包装,打造与众不同个性

在云仓酒庄洒派的定制红酒服务中&#xff0c;为消费者提供个性化、专属的标签与包装设计是提升红酒与众不同性和纪念价值的关键环节。通过巧妙的设计&#xff0c;消费者可以打造出与众不同的红酒&#xff0c;展现自己的个性与品味。 首先&#xff0c;标签设计是展现红酒个性的重…

Mysql 的高可用详解

Mysql 高可用 复制 复制是解决系统高可用的常见手段。其思路就是&#xff1a;不要把鸡蛋都放在一个篮子里。 复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上&#xff0c;备库本身也可以被配置成另外一台服务器的主库。主…

MYSQL--(1.存储引擎 *2.事务*)

一 存储引擎: 1.介绍 1>在数据库管理系统当中通过使用数据引擎来实现数据的增删改,查询 2>不同的存储引擎提供的有不同的存储机制,索引技巧等功能 MYSQL的核心,就是存储引擎 3>同样的,用户也可以根据自己的需要进行选择,更改自己需要…

用c# 自己封装的Modbus工具类库源码

前言 Modbus通讯协议在工控行业的应用是很多的&#xff0c;并且也是上位机开发的基本技能之一。相关的类库也很多也很好用。以前只负责用&#xff0c;对其并没有深入学习和了解。前段时间有点空就在这块挖了挖。想做到知其然还要知其所以然。所以就有了自己封装的Modbus工具类库…

Vue+SpringBoot打造在线课程教学系统

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…

WampServer环境下载安装并结合内网穿透实现远程访问管理界面

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…