算法题 如何找到数组中重复的数字

面试题3 数组中重复的数字

  • 题 目 :找出数组中重复的数字。
  • 在一个长度为n的数组里的所有数字都在0 ~ n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7 的数组{2,3, 1,0, 2, 5, 3} , 那么对应的输出是重复的数字2 或者3。
  • 先把输入的数组排序。从排序的数组中找出重复的数字是一件很容易的事情,只需要从头到尾扫描排序后的数组就可以了。排序一个长度为n的数组需要O(nlogn)的时间
  • 还可以利用哈希表来解决这个问题。从头到尾按顺序扫描数组的每个数字,每扫描到一个数字的时候,都可以用0(1)的时间来判断哈希表里是否已经包含了该数字。如果哈希表里还没有这个数字,就把它加入哈希表。如果哈希表里已经存在该数字,就找到一个重复的数字。这个算法的时间复杂度是0(n),但它提高时间效率是以一个大小为o(n)的哈希表为代价的。
  • 我们再看看有没有空间复杂度是0(1)的算法。如果这个数组中没有重复的数字,那么当数组排序之后数字i将出现在下标为 i 的位置。由于数组中有重复的数字,有些位置可能存在多个数字,同时有些位置可能没有数字。
  • 现在让我们重排这个数组。从头到尾依次扫描这个数组中的每个数字。当扫描到下标为i的数字时,首先比较这个数字(用m表示)是不是等于i. 如果是,则接着扫描下一个数字;如果不是,则再拿它和第 m 个数字进行比较。如果它和第m个数字相等,就找到了一个重复的数字(该数字在下标为i和m 的位置都出现了);如果它和第m个数字不相等,就把第i个数 字和第m个数字交换,把m 放到属于它的位置。接下来再重复这个比较、 交换的过程,直到我们发现一个重复的数字
  • 例子:数组{2,3,1,0,2,5,3};数组的第0个数字(从0开始计数)是2,与他的下标不匹配,因此将a[0]元素指定的坐标2互换,换完之后的结果是{1,3,2,0,2,5,3};这个时候0号元素是1,仍然和小标不匹配,继续更换;更换之后的结果是{3,1,2,0,2,5,3};接下来继续交换第0号元素和第3号元素,{0,1,2,3,2,5,3};0号元素、1号元素、2号元素、3号元素均匹配,当4号元素对应的数值是2和2号元素重复,因此找到了一个重复的数字
class Solution {
public:int findRepeatNumber(vector<int>& nums) {int length = nums.size();/*   if (length < 0){return -1;}for (int i = 0; i < length; ++i) {if (nums[i] < 0 || nums[i] > length){return false;}}*/for (int i = 0; i < length; i++) {while (nums[i] != i){if (nums[i] == nums[nums[i]]){return nums[i];} else{int temp = nums[i];nums[i] = nums[temp];nums[temp] = temp;}}}return -1;}
};
  • Leetcode对应的题目地址

第二种解法

  • 使用map,第一次遍历元素,key是元素的本身数值,value是元素出现的次数,存储所有的元素和出现次数的相关信息
  • 第二次遍历元素,查找元素出现的次数大于等于2的,返回对应的元素
    int findRepeatNumber_3(std::vector<int>& nums) {std::map<int,int> map{};int length = nums.size();for (int i = 0; i < length; ++i) {map[nums[i]]++;}for (auto i = map.cbegin(); i != map.cend(); ++i) {if (i->second == 2){return i->first;}}return -1;}

第三种解法

  • 使用无需map,将元素加入map的时候就要判定,是不是之前已经存在了此元素,如果存在此元素,将其返回
    int findRepeatNumber_2(std::vector<int>& nums) {std::unordered_map<int,int> map{};int length = nums.size();for (int i = 0; i < length; ++i) {if (map.find(nums[i]) != map.end()){return nums[i];} else{map[nums[i]]++;}}return -1;}

第四种解法

  • 将元素按照次序进行排序,然后判断相邻元素是否相等,如果相等则将其返回

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

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

相关文章

数学建模5 代码论文降重 Excel表处理数据

代码降重 1&#xff09;在代码中加入自己的注释 2&#xff09;替换变量名&#xff0c;a->jude 3&#xff09;代码中英文使用很小的字母&#xff0c;再颜色透明化&#xff08;慎用&#xff09; 文章降重 1&#xff09;模型介绍&#xff0c;优缺点等网上容易查到的内容自己…

C++ Map简单介绍 ,比如添加元素、删除元素和打印元素

介绍 map是一种键值对容器&#xff0c;第一个数值为关键字&#xff08;key&#xff09;&#xff0c;第二个数值为该元素对应的出现的次数。如果是map&#xff0c;key只会出现一次&#xff0c;如果是unordered_map&#xff0c;无此限制。此外&#xff0c;map会对元素进行排序&a…

Python学习1 基础语法 数据类型 计算机基础

Python的重要性 python就业方向 Python的历史 python创造于1989年&#xff0c;荷兰人吉多.范罗苏姆 现在是Python3版本 09 Python的特点 1&#xff09;跨平台 2&#xff09;解释型语言 3&#xff09;交互式 4&#xff09;面向对象&#xff1a;一切皆对象 5&#xff09;具有一…

算法考题 替换空格

参考链接 letcode官网题目地址 题目要求&#xff1a; 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。示例 1&#xff1a; 输入&#xff1a;s "We are happy." 输出&#xff1a;"We%20are%20happy." 来源&#xff1a;力扣&a…

Python学习2 条件判断语句if,循环语句for while

顺序&#xff0c;分支&#xff0c;循环结构 条件判断语句if 1&#xff09;if…else… 2) if…elif…else 注意&#xff1a; 1&#xff09;python中不支持switch…case语句 2&#xff09;注意缩进&#xff01; 3&#xff09;区间范围内允许连续比较&#xff1a; if 1<2<…

使用VS2019创建项目,添加文件和库地址

1&#xff0c;创建项目的类型很重要&#xff0c;fisherman服务器密码机使用C语言进行开发&#xff0c;只可以使用控制台应用 将需要的头文件拷贝到新建的工程里面 然后&#xff0c;打开解决方案资源管理器&#xff0c;点击添加&#xff0c;添加现有项&#xff0c;选中拷贝的头…

java -web html5学习1

基础标签 <!--html5声明--> <!DOCTYPE html> <!--html标签--> <html lang"en"> <!--文档头--> <head> <!--告知浏览器此页面属于什么字符编码格式,--><meta charset"UTF-8"> <!-- 用于标识当前网页的…

中科大 计算机网络2 什么是互联网

概论 互联网 1&#xff09;网络–包括节点和边&#xff0c;与大小无关&#xff0c;如蜘蛛网&#xff0c;大脑神经元。。 下图的网络是一样的 2&#xff09;计算机网络 联网的计算机所构成的系统 包括主机节点&#xff08;笔记本&#xff0c;ipad,手机&#xff0c;联网的冰箱等…

虚拟机下Ubuntu配置IP地址和网段

服务器密码机的地址是172.27.120.99 ubuntu系统的IP地址是192.168.133.138&#xff0c;使用net方式和主机共享网络。现需要修改ip地址 第一步&#xff0c;net方式是不对的&#xff0c;需要选择桥接方式&#xff0c;复制物理连接状态 然后修改主机的物理连接&#xff0c;选择搜…

渔翁服务器密码机的环境配置

Linux版本 需要将配置文件 FMDevice.conf 存储到 /etc目录下需要将库文件 libfmapiv100.so 存储到 /lib64目录下编译的命令 gcc main.c ./libfmapiv100.so -lpthread -o test 需要指定 ./libfmapiv100.so&#xff0c;如果需要别的库也需要进行指定&#xff0c;比如…

王道考研 计算机网络1 计算机网络概念,组成,功能和分类

计算机网络概念&#xff0c;组成&#xff0c;功能和分类 怎样学习计算机网络 计算机网络概念 1&#xff09;网络和计算机网络区别 网络包含计算机网络&#xff08;是通信技术和计算机技术相结合的产物&#xff09; 2&#xff09;计算机网络的概念 分散的&#xff1a;指地理位…

ubuntu 修改旋转屏幕显示方向 恢复正常模式

参考链接 https://blog.csdn.net/YYshuangshuang/article/details/90576997 使用命令如下 xrandr -o normal 回到正常角度

王道考研 计算机网络2 标准化工作

标准化工作 要实现不同厂商的硬软件之间相互连通&#xff0c;必须遵从统一的标准 标准的分类&#xff1a; 法定标准&#xff1a;国内外 RFC请求评论 RFC请求评论–因特网标准 是一个因特网标准就一定是RFC形式&#xff0c;但不是所有的RFC都是因特网标准 之前的阶段&#…

二叉搜索树判定

leetcode的原文链接树的定义C版本 需要给每一个节点的数值划分范围若任意节点的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;任意节点的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b;任意节点的左、右子树…

王道考研 计算机网络3 速率相关的性能指标

速率 指快慢 比特&#xff1a;1/0&#xff08;1位比特&#xff09; 速率&#xff1a;单位换算1000倍&#xff08;小写b&#xff09;&#xff0c;如&#xff0c;b/s比特每秒&#xff1b;kb/s千比特每秒 存储容量&#xff1a;单位换算1024倍(大写B)&#xff0c;如B字节&#xf…

C++ limits头文件的用法numeric_limits

参考链接 Cplus plus参考链接numeric_limits<double>::max ()是函数&#xff0c;返回编译器允许的 double 型数 最大值。类似的 numeric_limits<int>::max () 返回 编译器允许的 int 型数 最大值。需包含头文件 #include <limits> imits是STL提供的头文件&…

Linux系统运维1 运维 项目研发 网站 服务器 计算机基础 Linux操作系统

运维的基本概念 运维行业前景 企业运作模式 四大部门 项目研发流程 职责描述&#xff1a; 运维的作用&#xff1a; 网站的相关概念 网站运行流程&#xff1a; IP<–>域名 重要概念&#xff1a; 服务器图片&#xff1a; 服务器&#xff1a;为用户提供服务的机器&…

Linux 时间函数的使用

头文件 #include <chrono> #include <functional>namespace hsm { namespace common {class Timer { public:Timer();void reset();long peek_us() const;long peek_ms() const;double peek_msf() const;double record_msf(const std::function<void()> &am…

王道考研 计算机网络4 速率相关的性能指标

时延 发送时延; 发送时延;10bit 除以10b/s1s 传播时延&#xff1a; 100 m除以10m/s10s 当信道宽带提高&#xff08;发送速率&#xff09;&#xff0c;发送时延减少&#xff0c;但并不会提高传播时延–高速链路情况 总&#xff1a; 时延带宽积 描述数据量&#xff0c;链路…

std::chrono::duration_cast时间计算

参考链接 std::chrono::duration_cast