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 hereint 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 hereint 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.hqwc.cn/news/492987.html

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

相关文章

linux c++ 开发 tensorrt 安装

tensorrt 官方下载地址&#xff08;需要注册账号登录&#xff09;&#xff1a;Log in | NVIDIA Developer 根据系统发行版和CUDA版本 (nvcc -V) 选择合适的安装包 EA&#xff08;early access&#xff09;版本代表抢先体验。 GA&#xff08;general availability&#xff09;代…

redis——客户端

Redis是一个典型一对多服务器程序&#xff0c;一个服务器可以与多个客户端进行网络连接&#xff0c;每隔客户端可以向服务器发送命令请求&#xff0c;而服务器则接收并处理客户端发送的命令请求&#xff0c;并向客户端返回命令请求。 通过是一个I/O多路复用技术实现的文件事件处…

U-Mail邮件系统反垃圾病毒解决方案

随着互联网的快速发展和广泛应用&#xff0c;人类正逐步地从工业社会迈入信息社会&#xff0c;网络也已经越来越成为生产经营活动的重要场所。例如电子邮件就已经企业内外部信息交流的重要工具&#xff0c;它的应用还可以提高企业办公效率&#xff0c;利于企业信息流通的系统化…

网络原理——HTTPS

HTTPS是 在HTTP的基础上&#xff0c;引入了一个加密层&#xff08;SSL)。 1. 为什么需要HTTPS 在我们使用浏览器下载一些软件时&#xff0c;相信大家都遇到过这种情况&#xff1a;明明这个链接显示的是下载A软件&#xff0c;点击下载时就变成了B软件&#xff0c;这种情况是运…

Java8 Stream API 详解:流式编程进行数据处理

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

【踩坑】修复报错 you should not try to import numpy from its source directory

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 报错如下&#xff1a; 修复方法一&#xff1a; pip install pyinstaller5.9 修复方法二&#xff1a; pip install numpy1.24.1

内部变形观测:监测仪器在工程中的应用

在工程领域&#xff0c;内部变形观测是确保建筑物安全稳定的关键环节。为了实现这一目标&#xff0c;我们需要借助一系列先进的仪器进行监测。本文将详细介绍在内部变形观测中常用的监测仪器。 垂直位移(沉降)观测在土石坝和混凝土坝中具有重要意义。对于土石坝&#xff0c;我们…

多态的讲解

多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学生…

抖店是怎么运营做起来的?抖音小店每天都需要做什么?新手必看!

大家好&#xff0c;我是电商花花。 很多人疑惑开抖音小店之后&#xff0c;选好商品上架之后每天都需要做什么&#xff1f; 不少新手在开了抖音小店之后每天除了选品之后就不知道要做些什么了。 今天给大家分享一下我们每天做抖音小店的工作内容有哪些&#xff0c;如果你是新…

代码随想录算法训练营第二十一天| 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

文章目录 1.二叉搜索树的最小绝对差2.二叉搜索树中的众数3.二叉树的最近公共祖先 1.二叉搜索树的最小绝对差 因为二叉搜索树的中序遍历是有序的&#xff0c;所以在中序递归遍历的基础上&#xff0c;记录前一个节点的指针&#xff0c;递归的过程中用后一个节点减去前一个&#x…

企业数字化转型,如何选择适合的邮件系统?

随着数字经济的发展&#xff0c;数字办公已经成为企业未来发展的必经之路。而邮件系统作为企业内外沟通的重要办公工具&#xff0c;在企业数字化转型中发挥着重要作用。它能够帮助企业更便捷地跟踪管理业务&#xff0c;优化流程、提升工作效率和协同能力。但是&#xff0c;企业…

给自己留个备忘,blender是右手坐标系

所谓右手坐标系&#xff0c;就是三个轴的方向和右手三根手指的方向一致&#xff08;当然&#xff0c;有要求的&#xff0c;这个要求是大拇指指向x轴方向&#xff0c;食指指向y轴方向,中指指向z轴方向&#xff09;。 不过blender默认是z轴朝上的&#xff0c;如下图。 右手坐标系…