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.rhkb.cn/news/264270.html

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

相关文章

Unity发布webgl获取浏览器的URL

Unity发布webgl获取浏览器的URL Unity发布webgl之后获取浏览器的url 在unity中创建文件夹Plugins&#xff0c;然后添加添加文件UnityGetBrowserURL.jslib var GetUrlFunc {//获取地址栏的URLStringReturnValueFunction: function () {var returnStr window.top.location.hre…

【Java程序员面试专栏 数据结构】三 高频面试算法题:栈和队列

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,因为栈和队列这两哥们结构特性比较向对应,所以放到一篇Blog中集中练习 题目题干直接给出对应博客链接,这里只给出简单思路、代码实现、复杂度分析 题目关键字…

Less预处理器教程

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学&#xff0c;可以点心心支持一下哈 一、Less介绍 less官方文档 lesscss.org/ less中文文档 less.bootcss.com/ less是一种css预处理器&#xff0c;它扩展了css语言&#xff0c…

OpenCV开发笔记(七十五):相机标定矫正中使用remap重映射进行畸变矫正

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/136293833 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子(红模仿…

Day15-集合-迭代器-课后练习-参考答案

文章目录 Day15_课后练习泛型练习题第1题第2题第3题第4题第5题 集合练习题第1题第2题 Day15_课后练习 泛型练习题 第1题 案例&#xff1a;有如下四个学生的成绩&#xff1a; &#xff08;1&#xff09;用Comparable接口对下列四位同学的成绩做降序排序&#xff0c;如果成绩一…

SQL Server 开发环境配置教程(SSMS+SQL Prompt)

背景 记录一下 SQL Server 常用开发软件 体验了各种数据库IDE(DBeaver、Navicat、DataGrip)之后综合下来还是感觉 SSMSSQL Prompt 对于 SQL Server 最好用&#xff0c;所以在此记录一下配置过程 数据库可视化管理工具SSMS 官方下载地址&#xff1a; https://learn.microsoft…

【Simulink系列】——动态系统仿真 之 混合系统

声明&#xff1a;本系列博客参考有关专业书籍&#xff0c;截图均为自己实操&#xff0c;仅供交流学习&#xff01; 一、混合系统概述 由不同类型系统共同构成的系统称为混合系统&#xff01;仿真时必须考虑连续信号和离散信号的采样匹配问题&#xff0c;一般使用变步长连续求…

【JavaScript 漫游】【021】EventTarget 接口

事件的本质是程序各个组成部分之间的一种通信方式&#xff0c;也是异步编程的一种实现。DOM 支持大量的事件。 EventTarget 接口概述 DOM 的事件操作&#xff08;监听和触发&#xff09;&#xff0c;都定义在 EventTarget 接口。所有节点对象都部署了这个接口&#xff0c;其他…

[云原生] 二进制安装K8S(上)搭建单机matser、etcd集群和node节点

一、单机matser预部署设计 目前Kubernetes最新版本是v1.25&#xff0c;但大部分公司一般不会使用最新版本。 目前公司使用比较多的&#xff1a;老版本是v1.15&#xff0c;因为v1.16改变了很多API接口版本&#xff0c;国内目前使用比较多的是v1.18、v1.20。 组件部署&#xff…

React18源码: schedule任务调度messageChannel

React调度原理(scheduler) 在React运行时中&#xff0c;调度中心&#xff08;位于scheduler包&#xff09;是整个React运行时的中枢&#xff08;其实是心脏&#xff09;&#xff0c;所以理解了scheduler调度&#xff0c;就基本掌握了React的核心React两大循环&#xff1a;从宏…

Linux学习之vi/vim详细介绍

目录 ​编辑 1. 什么是 vim&#xff1f; 2. vi/vim 的使用 2.1 命令模式 2.2 输入模式 2.3 底线命令模式 3. vi/vim 使用实例 3.1 使用 vi/vim 进入一般模式 3.2 按下 i 进入输入模式(也称为编辑模式)&#xff0c;开始编辑文字 3.3 按下 ESC 按钮回到一般模式…

【Git企业实战开发】Git常用开发流操作总结

【Git企业实战开发】Git常用开发流操作总结 大家好 我是寸铁&#x1f44a; 总结了一篇Git常用开发流操作总结的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 现在刚做项目的伙伴&#xff0c;可能你之前学过git&#xff0c;但是一实战发现不熟悉 没关系&#xff0c;看寸铁这篇…

LLM 模型融合实践指南:低成本构建高性能语言模型

编者按&#xff1a;随着大语言模型技术的快速发展&#xff0c;模型融合成为一种低成本但高性能的模型构建新途径。本文作者 Maxime Labonne 利用 mergekit 库探索了四种模型融合方法&#xff1a;SLERP、TIES、DARE和passthrough。通过配置示例和案例分析&#xff0c;作者详细阐…

Base64 编码 lua

Base64 编码 -- Base64 字符表 local base64_chars { A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,…

Docker复习笔记

Centos7安装Docker Docker官网:www.docker.com Docker官网仓库:hub.docker.com Docker文档是比较详细的 安装相关依赖 yum -y install gcc gcc-c yum install -y yum-utils 设置docker镜像仓库 yum-config-manager --add-repo https://download.docker.com/linux/centos/do…

高分SCI绘图必备!你必须要学会的18种Matlab绘图代码与20个绘图技巧(附完整代码)

目录 绘图技巧篇 绘图代码篇 免费完整代码获取​ 今天为大家带来一期18种Matlab绘图代码与20个绘图技巧代码&#xff0c;所有代码完全免费&#xff01; 如果你想发SCI&#xff0c;普通的图已经进入不了审稿人的视线了&#xff0c;非常容易被拒稿。试想&#xff0c;如果一篇…

【b站咸虾米】chapter5_uniapp-API_新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握

课程地址&#xff1a;【新课uniapp零基础入门到项目打包&#xff08;微信小程序/H5/vue/安卓apk&#xff09;全掌握】 https://www.bilibili.com/video/BV1mT411K7nW/?p12&share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 5 API 5.1 页面和路…

【Java程序设计】【C00287】基于Springboot的疫情防控期间某村外出务工人员管理系统(有论文)

基于Springboot的疫情防控期间某村外出务工人员管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的疫情防控期间某村外出务工人员信息管理系统 本系统分为系统功能模块、管理员功能模块、用户功能模块、采集…

两结点之间创建简单的梁单元并进行线性网格划分的方法

进入1D面板->进入bars界面 https://zhuanlan.zhihu.com/p/613163100

【Unity】Unity与安卓交互

问题描述 Unity和安卓手机进行交互&#xff0c;是我们开发游戏中最常见的场景。本教程将从一个简单的例子来演示一下。 本教程需要用到Android Studio2021.1.1 1.Android Studio新建一个工程 2.选择Empty Activity 然后点击Next 3.点击Finish完成创建 4.选择File-New-New Mo…