每日一题--寻找重复数

蝶恋花-王国维

阅尽天涯离别苦,

不道归来,零落花如许。

花底相看无一语,绿窗春与天俱莫。
待把相思灯下诉,

一缕新欢,旧恨千千缕。

最是人间留不住,朱颜辞镜花辞树。

目录

题目描述:

思路分析: 

方法及时间复杂度:

法一 排序数组(暴力解法):

法二 哈希表

法三 二分查找(经典解法)

法四 快慢指针

法五 二进制(烧脑解法)

个人总结: 


 题目描述:

 287. 寻找重复数 - 力扣(LeetCode)

思路分析: 

在一个数组中查找唯一重复的元素,可以用很多解法,立马想到的便是哈希表。将数组元素插入哈希表,然后查找哈希表,找到了就返回该数

 方法及时间复杂度:

法一 排序数组(暴力解法):

将数组进行排序,这样重复的元素一定相邻,然后遍历排序后的数组就行。代码如下:

 

int cmp(const void*a,const void*b){return *(int*)a-*(int*)b;
}
int findDuplicate(int* nums, int numsSize) {qsort(nums,numsSize,sizeof(int),cmp);for(int i=1;i<numsSize;++i){if(nums[i]==nums[i-1]){return nums[i];}}return -1;
}

时间复杂度O(nlogn) 排序的时间nlogn

空间复杂度O(1) 

法二 哈希表

利用哈希表查找哈希表中存在的元素,即数组重复的元素。可以使用c++容器的哈希集合unordered_set,这里用c语言数组模拟了一个哈希表。代码如下:

int findDuplicate(int* nums, int numsSize) {int hash[100001]={0};//初始化哈希表所有元素为0for(int i=0;i<numsSize;++i){if(hash[nums[i]]){//查找哈希表中是否存在该元素return nums[i];}hash[nums[i]]++;}return -1;    
}

时间复杂度O(n) 

空间复杂度O(n) 空间换时间了属于是

法三 二分查找(经典解法)

用此方法前先弄清楚什么是鸽巢原理。

鸽巢原理:也称为抽屉原理,是一个基本的数学原理,这个原理的经典解释是,就像将若干只鸽子放在若干个鸽巢中一样,如果鸽子的数量大于鸽巢的数量,那么至少有一个鸽巢中放了两只鸽子。

这里抽象成二分查找那个装有两只鸽子的鸽巢

 二分查找的区间很明显就是【1,n-1】,n为数组长度。查找中点mid(先猜一个鸽巢),遍历数组并记录<=mid的数,如果<=mid的数大于mid说明这个有着两只鸽子的鸽巢在左区间,反之,如果<=mid的数小于等于mid,就在右区间。直到left==right时,这个鸽巢就是有着两只鸽子的鸽巢。

代码如下:

int findDuplicate(int* nums, int numsSize) {int left=1,right=numsSize-1;while(left<right){int mid=(left+right)>>1;int cnt=0;for(int i=0;i<numsSize;++i){if(nums[i]<=mid){cnt++;}}if(cnt>mid){right=mid;}else{left=mid+1;}}return left;
}

时间复杂度O(nlogn) 二分查找时间复杂度 logn,然后每次查找都要遍历数组O(n)

空间复杂度O(1) 

法四 快慢指针

下标向值引一条边,值向下标引一条边,从0开始沿着箭头走,逐渐就会进入一个环,环的入口就是重复的元素

类似于环形链表,定义快指针fast,慢指针slow。慢指针每次走一步,快指针每次走两步,快指针会在环里追上慢指针,然后让快指针从0开始走,快慢指针同时走一步,相逢时就是环的入口,即重复元素。

代码如下:

int findDuplicate(int* nums, int numsSize) {int slow=0,fast=0;do{slow=nums[slow];fast=nums[nums[fast]];}while(slow!=fast);fast=0;while(slow!=fast){slow=nums[slow];fast=nums[fast];}return slow;
}

时间复杂度O(n) 

空间复杂度O(1)

法五 二进制(烧脑解法)

可以使用二进制位运算来解决此题。我们可以将数组 nums 中的每一个数字用二进制来表示,最多只需要 log(n) 位,其中 n 是数组 nums 的长度。

对于每一位 i,我们可以计算在此位上所有数字出现的次数之和。如果某一位上的出现次数之和大于 2,说明出现了重复的数字。

具体做法如下:

  1. 对于二进制的第 i 位,计算所有数字的二进制表示中第 i 位上出现 1 的次数之和(可以使用位运算和移位操作进行统计)。
  2. 如果第 i 位上出现 1 的次数之和大于 2,说明重复数字在此位上的值为 1,否则为 0。
  3. 将所有位上确定的二进制位还原成对应的十进制数字,即为重复的数字。

代码如下:

int findDuplicate(int* nums, int n) {int  ans = 0;// 确定二进制下最高位是多少int bit_max = 31;while (!((n - 1) >> bit_max)) {bit_max -= 1;}for (int bit = 0; bit <= bit_max; ++bit) {int x = 0, y = 0;for (int i = 0; i < n; ++i) {if (nums[i] & (1 << bit)) {x += 1;}if (i >= 1 && (i & (1 << bit))) {y += 1;}}if (x > y) {ans |= 1 << bit;}}return ans;
}

时间复杂度O(nlogn)  枚举二进制数的位数个数O(logn)

空间复杂度O(1)

个人总结: 

二分查找的算法其实还可以优化。 有位大师曾经说过,完成比完美更重要。

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

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

相关文章

【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷10

单选题 1、烤面包的架子上一次最多只能烤两个面包&#xff0c;烤一个面包每面需要2分钟&#xff0c;那么烤三个面包最少需要多少分钟 A、4 分钟 B、6 分钟 C、8 分钟 D、10 分钟 答案&#xff1a;B 2、甲和乙轮流向两个同样大小的瓶子中投入小球。两人每次都可以向任一瓶…

Codeforces Round 911 (Div. 2)DE「欧拉反演」「tarjan缩点+DAG上dp」

Problem - D - Codeforces 思路 只选两个小数计算贡献&#xff0c;可对序列排序&#xff0c;每对 ( i , j ) (i, j) (i,j) 其中 ( i < j ) (i<j) (i<j)的的贡献是 g c d ( i , j ) ⋅ ( n − j ) gcd(i, j) \cdot (n - j) gcd(i,j)⋅(n−j) 通过预处理因数欧拉反演可…

搭建Appium工具环境

1、安装Java Development Kit&#xff08;JDK&#xff09; 前往Oracle官网下载JDK。 在https://www.oracle.com/java/technologies/javase-jdk11-downloads.html 找到最新版本的JDK。根据操作系统选择适合的版本&#xff0c;并根据指示下载安装程序。 安装JDK。运行下载的安…

Unknown error 1054

MySQL错误1054是“Unknown column”的错误&#xff0c;意味着在查询或语句中引用了一个不存在的列名。这通常是因为在查询中指定了一个不存在的列名。 解决步骤&#xff1a; 检查列名的拼写&#xff1a;确保在查询或语句中正确地输入了列名。检查大小写&#xff0c;确保与数据…

动静分离+多实例实验(nginx+tomcat)

Nginx服务器&#xff1a;192.168.188.14:80 Tomcat服务器1&#xff1a;192.168.188.11:80 Tomcat服务器2&#xff1a;192.168.188.12:8080 192.168.188.12:8081 部署Nginx负载均衡器 关闭防火墙 systemctl stop firewalld setenforce 0 安装依赖 yum -y install pcre-dev…

Java 基础学习(二)运算符与分支流程控制

1 运算符 1.1 运算符概述 1.1.1 运算符概述 运算符是一种告诉计算机执行特定的数学或逻辑等操作的符号。Java运算符号包括&#xff1a;数学运算符、关系运算符、逻辑运算符、赋值运算符号、字符串连接运算符。计算机本质上只能处理数字&#xff0c;处理数字的最常见的方式就…

csrf跨站请求伪造详解

【1】csrf跨站请求伪造的解释及解决方法 CSRF&#xff08;Cross-Site Request Forgery&#xff09;跨站请求伪造是一种常见的网络攻击方式。攻击者通过诱导受害者访问恶意网站或点击恶意链接 将恶意请求发送到目标网站上利用受害者在目标网站中已登录的身份来执行某些操作从而…

华夏ERP信息泄露漏漏洞复现 [附POC]

文章目录 华夏ERP信息泄露漏漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 华夏ERP信息泄露漏漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#x…

好用的基于layui的免费开源后台模版layuimini

发现一个好用的后台模版 基于layui的免费开源后台模版layuimini layuimini - 基于Layui的后台管理系统前端模板 easyadmin开源项目 EasyAdmin是基于ThinkPHP6.0Layui的快速开发的后台管理系统。 演示站点 演示地址&#xff1a;跳转提示&#xff08;账号&#xff1a;admin&a…

Java实现—数据结构 1.初识集合框架

一、什么是集合框架 Java集合框架&#xff0c;又被称为容器&#xff0c;是定义在java.util包下的一组接口interfaces和其实现类classes 其主要表现为将多个元素element置于一个单元中&#xff0c; 集合框架是由若干个类组成的&#xff0c;每个类的背后就是一种数据结构&…

Jupyter Markdown 插入图片

首先截图 注意 这一步是关键的&#xff01;&#xff01; 它需要使用电脑自带的截图&#xff0c;用qq啊vx啊美图秀秀那些都不行哦。 截图之后复制&#xff1a; 然后快捷键粘贴到jupyter里面&#xff0c;它会生成一段代码&#xff08;没有代码就是说截图形式不对&#xff09;&a…

【数据结构】线段树

目录 1.概述2.代码实现2.1.聚合操作——求和2.2.聚合操作——求和、求最小值、求最大值 3.应用4.与前缀和之间的区别 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 1.概述 &#xff08;1&#xff09;线段树 (Segment Tree) 是一种二叉树形数据结构&#xff…

linux 用户级别修改文件句柄数不生效

修改/etc/security/limits.conf 句柄数后发现无效需要执行以下操作。 1. vi /etc/ssh/sshd_config 2. StrictModes no/yes 3. UsePAM yes 4. service sshd restart 5. /etc/systemd/user.conf 新增DefaultLimitNOFILE65535 6. /etc/systemd/system.conf 新增DefaultLimitN…

logback-spring.xml的内容格式

目录 一、logback-spring.xml 二、Logback 中的三种日志文件类型 一、logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <configuration scan"true" scanPeriod"10 seconds" ><!-- <statusListener…

C#使用WebSocket进行链接

C#使用WebSocket进行网络链接&#xff0c;和服务端搭建一个长连接进行通信。 有两种方式&#xff1a;串口方式&#xff08;SerialPort&#xff09;和网口方式&#xff08;Socket 包括&#xff1a;TcpClient和UdpClient&#xff09; 准备&#xff1a; 1.C#使用WebSocket的一种…

《100 Java Mistakes and How to Avoid Them》笔记 1

这几日在阅读 Manning 出版社的 《100 Java Mistakes and How to Avoid Them》, 其中列举的确实是一些容易带入到代码中的错误&#xff0c;不少还是通过代码 Review 或单元测试很难发现的问题。也有些看似很弱智&#xff0c;却可能是隐匿许久的定时炸弹&#xff0c;只等某一特定…

pandas教程:Advanced GroupBy Use 高级GroupBy用法

文章目录 12.2 Advanced GroupBy Use&#xff08;高级GroupBy用法&#xff09;1 Group Transforms and “Unwrapped” GroupBys&#xff08;组变换和无包装的GroupBy&#xff09;2 Grouped Time Resampling&#xff08;分组时间重采样&#xff09; 12.2 Advanced GroupBy Use&a…

图形编辑器开发:快捷键的管理

大家好&#xff0c;我是前端西瓜哥。 快捷键操作在图形编辑器中是很高频的操作&#xff0c;能让用户快速高效地执行特定命令&#xff0c;今天讲讲图形编辑器如果管理快捷键。 编辑器 github 地址&#xff1a; https://github.com/F-star/suika 线上体验&#xff1a; https://b…

计算机网络:网络层

0 本节主要内容 问题描述 解决思路 1 问题描述 两大问题&#xff08;重点&#xff0c;也是难点&#xff09;&#xff1a; 地址管理&#xff1b;路由选择。 1.1 子问题1&#xff1a;地址管理 网络上的这些主机和节点都需要使用一种规则来区分&#xff0c;就相当于是一种身…

说说过量 tcp pure ack 的利弊

tcp 的 ack 实在太多了&#xff0c;如果互联网上 80% 报文是 tcp&#xff0c;那么其中 1/3 的报文都是 ack&#xff0c;此前写过几篇短文&#xff0c;比如 丢弃一些 pure ack 和 注入或利用 pure ack。 简单说&#xff0c;tcp 依靠 ack 提供 self-clock&#xff0c;发送 data …