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

news2024/10/3 2:15:55

文章目录

  • 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,它出现的次数超过了数组长度的一半。

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


今天就到这里啦!

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

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

相关文章

《论文阅读》利用提取的情感原因提高共情对话生成的内容相关性 CCL 2022

《论文阅读》利用提取的情感原因提高共情对话生成的内容相关性 前言简介模型架构情绪识别情绪原因提取实验结果示例总结前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《Using Extracted Emotion Caus…

el-tab-pane标签页如何加图标

效果如下 主要修改 <el-tab-pane name"tab6" v-if"subOrderType 10 && urlname ! wgSalesTerminationOrder"><span slot"label"> 售后判责<span class"el-icon-warning" style"color:#F66B6C;"&…

电脑dll缺失怎么办,找不到dll的多种解决方法分享

dll文件在计算机领域中扮演着至关重要的角色&#xff0c;它代表的是Dynamic Link Library&#xff08;动态链接库&#xff09;文件。那么&#xff0c;究竟什么是dll文件呢&#xff1f;简单来说&#xff0c;dll文件是一种特殊的程序模块&#xff0c;其中包含了可以被多个应用程序…

Web3的奇迹:数字世界的新篇章

在数字化时代的潮流中&#xff0c;Web3正以其令人振奋的潜力和前景引领着我们进入一个全新的数字时代。作为互联网的下一代&#xff0c;Web3将重新定义我们对数字世界的认知和体验&#xff0c;为我们带来无限的可能性和奇迹。本文将深入探讨Web3的重要性、核心特征以及未来展望…

Nginx----高性能的WEB服务端(二)

一、高级配置 1、网页的状态页 基于nginx 模块 ngx_http_stub_status_module 实现&#xff0c;在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module&#xff0c;否则配置完成之后监测会是提示语法错误注意: 状态页显示的是整个服务器的状态,而非虚拟主机的…

【力扣白嫖日记】180.连续出现的数字

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 180.连续出现的数字 表&#xff1a;Logs 列名类型idintnumvarchar 找出所有至少连续出现三次的数字。 返回…

Spring之AOP源码解析(下)

前言 在上一遍文章中,我们主要讲解了ProxyFactory在Spring完成AOP动态代理的过程中发挥的作用。这一篇我们主要讲解这些注解都是如何注入Advisors,然后分析这些Advisors生效的条件 注解都是如何注入Advisor并匹配的 EnableTransactionManagement注解 我们在之前提到EnableT…

vue2实现无感刷新token

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4d8; 引言&#xff1a; &#x1f4…

商家入驻平台怎么让资金自动分配给商家

最近很多上线了多商户电商系统的朋友咨询&#xff0c;我们平台的用户支付后&#xff0c;钱进入了我们的对公账户&#xff0c;怎样让钱在走完流程后&#xff0c;自动进入商家的账户呢&#xff1f;今天商淘云为您分享商户入驻平台自动分配给商家资金的三种方法。 首先是平台应建立…

用户体验设计师如何在 2024抢占先机?

01. 严峻的经济形势和就业市场 我们生活在一个通货膨胀的时代。就从超市抓几个苹果、卷心菜、鸡蛋&#xff0c;看看价格吧&#xff01;我不得不多次检查收据&#xff0c;因为我简直不敢相信。外出就餐费用上涨了 10-20%&#xff0c;现在 Spotify 和 YouTube 要求收取更高的订阅…

Android 水波纹扩散效果实现

人生只是一种体验&#xff0c;不必用来演绎完美。 效果图 View源码 package com.android.circlescalebar.view;import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.animation.…

2024.2.27 模拟实现 RabbitMQ —— 网络通信设计(客户端)

目录 需求分析 RabbitMQ 客户端设定 ConnectionFactory&#xff08;连接工厂&#xff09; Connection&#xff08;连接&#xff09; Channel&#xff08;通道&#xff09; 针对 客户端 和 服务器 单元测试 需求分析 RabbitMQ 客户端设定 一个客户端可以有多个模块每个模块…

揭秘随身WiFi行业背后的创业故事:格行如何成为领头羊?

第一&#xff0c;聚焦蓝海市场。与其在红海市场与众多对手激烈竞争&#xff0c;不如寻找被忽视的市场需求。格行随身WiFi项目就是一个典型的例子&#xff0c;市场需求量大&#xff0c;比如网约车&#xff0c;外卖员&#xff0c;户外直播&#xff0c;租房党&#xff0c;经常外出…

苹果Vision Pro芯片级拆解:339S01186传感器协处理器,电源管理芯片:343S00627、343S00628、343S00629

2月2日&#xff0c;苹果官方发售Vision Pro后&#xff0c;引发了抢购潮&#xff0c;产品“秒光”&#xff0c;甚至将起售价 3499 美元一度炒到近 9 万元人民币的代购价。 日前知名维修网站iFixit又一次“首拆”了苹果Vision Pro&#xff0c;每一块电路板、每一颗螺丝钉、每一颗…

游泳耳机怎么选?2024年必看的四款王牌游泳耳机推荐!

游泳不仅能有效锻炼身体&#xff0c;还能帮助我们在炎炎夏日中消暑解热。而随着科技的发展&#xff0c;越来越多的智能设备开始融入我们的生活&#xff0c;其中就包括了专门为游泳爱好者设计的游泳耳机。在水下也能享受到音乐的乐趣&#xff0c;无疑为游泳这项运动增添了更多的…

petalinux_zynq7 驱动DAC以及ADC模块之五:nodejs+vue3实现web网页波形显示

前文&#xff1a; petalinux_zynq7 C语言驱动DAC以及ADC模块之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…

基于AMDGPU-ROCm的深度学习环境搭建

在风起云涌的AI江湖&#xff0c;NVIDIA凭借其CUDA生态和优秀的硬件大杀四方&#xff0c;立下赫赫战功&#xff0c;而另一家公司AMD也不甘示弱&#xff0c;带着他的生态解决方案ROCm开始了与不世出的NVIDA的正面硬钢&#xff0c;"ROCm is the answer to CUDA", AMD官网…

MySQL锁三部曲:临键、间隙与记录的奇妙旅程

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 MySQL锁三部曲&#xff1a;临键、间隙与记录的奇妙旅程 前言临键锁的奥秘间隙锁记录锁 前言 在数据库世界中&#xff0c;锁是维护数据完整性的一种关键机制。而MySQL中的临键锁、间隙锁和记录锁则是锁…

2024.2.25 -ElasticSearch 进阶

倒排索引 Elasticsearch的倒排索引机制是通过将文档中出现的词汇与它们所在的文档ID关联起来&#xff0c;实现快速查找包含特定词汇的文档。下面是一个具体的例子来说明倒排索引的工作原理&#xff1a; 假设我们有一个简单的文章集合&#xff0c;包含以下三篇文章&#xff1a…

pytorch 用F.normalization的逆归一化如何操作

逆归一化的时候再把这个数乘回去就行了 magnitude a.norm(p2, dim1, keepdimTrue) # NEW atorch.nn.functional.normalize(a, p2, dim1) a_or a* magnitude # NEW print(a_or) Outputs: tensor([]1,2,3)